[백준/Java] 2630 - 색종이 만들기

2025. 9. 6. 14:50·코딩테스트/백준

https://www.acmicpc.net/problem/2630

문제


풀이

주어진 정사각형을 계속 4분할 해야하므로 분할 정복을 활용해야 한다

  1. 색종이가 모두 같은 색이면 더 이상 자르지 않고 총 개수를 구한다
  2. 다른 색이라면 (현재 사이즈 / 2)로 4등분한다
  3. 1, 2를 재귀적으로 호출한다

코드

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;

public class Main {

    static int[][] arr;
    static int blue = 0;
    static int white = 0;

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        StringBuilder sb = new StringBuilder();

        // 색종이 정보 입력
        int N = Integer.parseInt(br.readLine());
        arr = new int[N][N];
        for (int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine());
            for (int j = 0; j < N; j++) {
                arr[i][j] = Integer.parseInt(st.nextToken());
            }
        }

        // 가장 큰 정사각형부터 분할 시작
        partition(0, 0, N);

        System.out.println(white);
        System.out.println(blue);

        br.close();
    }

    static void partition(int row, int col, int size) {
        // 현재 영역이 모두 같은 색인지 확인
        if (colorCheck(row, col, size)) {
            // 배열 값이 0이면 흰색이므로 흰색 +1
            if (arr[row][col] == 0) {
                white++;
            } else {
                // 배열 값이 1이면 파란색이므로 흰색 +1
                blue++;
            }
            // 같은 색이므로 더 이상 분할하지 않고 재귀 종료
            return;
        }

        // 색이 섞여있다면 4분할
        int newSize = size / 2;
        partition(row, col, newSize);   // part 1
        partition(row, col + newSize, newSize); // part 2
        partition(row + newSize, col, newSize); // part 3
        partition(row + newSize, col + newSize, newSize); // part 4
    }

    // 현재 영역에 색깔이 모두 같은지 확인하는 메서드
    static boolean colorCheck(int row, int col, int size) {
        // 첫번째 색깔
        int color = arr[row][col];
        for (int i = row; i < row + size; i++) {
            for (int j = col; j < col + size; j++) {
                // 다른 색깔이 나온다면 false 리턴
                if (color != arr[i][j]) {
                    return false;
                }
            }
        }
        // 다 같은 색이면 true 리턴
        return true;
    }
}

결과

'코딩테스트/백준' 카테고리의 다른 글
  • [백준/Java] 11279 - 최대 힙
  • [백준/Java] 2805 - 나무 자르기
  • [백준/Java] 1654 - 랜선 자르기
  • [백준/Java] 2667 - 단지번호붙이기
KDH.dev
KDH.dev
  • KDH.dev
    CodingHard
    KDH.dev
  • 전체
    오늘
    어제
    • 전체글 (81)
      • 코딩테스트 (74)
        • 프로그래머스 (13)
        • 백준 (61)
      • CS (3)
        • 네트워크 (3)
      • Spring (1)
      • Java (3)
        • 자료구조 (3)
        • 알고리즘 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    14940
    프로그래머스
    21736
    13913
    자료구조
    16935
    5525
    [LG유플러스] 유레카 백엔드 개발자
    프로그래머스 Lv.0
    CS
    18111
    자바
    네트워크
    백준
    코딩테스트
    17626
    11660
    부트캠프후기
    30804
    멀티캠퍼스it부트캠프
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
KDH.dev
[백준/Java] 2630 - 색종이 만들기
상단으로

티스토리툴바