# 백준 2630. 색종이 만들기

문제 링크

난이도 정답률(_%)
Silver 3 72.172%

# 설계

  • 종이의 길이 N <= 128
  • 문제 설명대로 종이의 색이 전부 같지 않으면 분할

# 시간 복잡도

  • 종이 색이 모두 같은지 비교 N^2
    • 같지 않으면 크기를 1/4로 나눠서 반복 (1/4*N)^2 * 4
  • O(N^2)

# 공간 복잡도

  • 색종이 공간을 저장하는 int형 이차원 배열
  • 색종이 색 조각 개수를 저장하는 int형 배열, 길이 2

# 풀이

  • 종이의 색이 모두 같은지 확인한다
    • 색이 같으면 해당 색의 Count를 늘린다.
    • 색이 같지 않으면, 종이를 4등분하여 종이의 색이 같을 때 까지 반복한다.

# 결과

메모리 실행 시간
16668KB 128ms

# 코드

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        int length = Integer.parseInt(br.readLine());
        Paper colorPaper = new Paper(length);

        for (int i = 0; i < length; i++) {
            colorPaper.setPaperColor(i, br.readLine().split(" "));
        }

        colorPaper.devidePaper(new Location(0, 0), new Location(length - 1, length - 1));

        bw.write(Integer.toString(colorPaper.getWhitePaperCount()));
        bw.write("\n");
        bw.write(Integer.toString(colorPaper.getBluePaperCount()));
        bw.flush();
        bw.close();
    }
}

class Paper {
    private int[][] paper;
    private int length;
    private int[] paperCount;

    public Paper(int length) {
        this.length = length;
        this.paper = new int[length][length];
        this.paperCount = new int[2];
    }

    public void setPaperColor(int row, String[] paperRow) {
        for (int i = 0; i < length; i++) {
            paper[row][i] = Integer.parseInt(paperRow[i]);
        }
    }

    public void devidePaper(Location start, Location end) {
        if (checkAllColorSame(start, end)) {
            int color = paper[start.row][start.col];
            paperCount[color] += 1;
            return;
        }

        Location middle = new Location((start.row + end.row) / 2, (start.col + end.col) / 2);
        devidePaper(start, middle); // 좌상
        devidePaper(new Location(start.row, middle.col + 1), new Location(middle.row, end.col)); // 우상
        devidePaper(new Location(middle.row + 1, start.col), new Location(end.row, middle.col)); // 좌하
        devidePaper(new Location(middle.row + 1, middle.col + 1), end); // 우하
    }

    public int getWhitePaperCount() {
        return paperCount[0];
    }

    public int getBluePaperCount() {
        return paperCount[1];
    }

    public boolean checkAllColorSame(Location start, Location end) {
        int color = paper[start.row][start.col];

        for (int i = start.row; i <= end.row; i++) {
            for (int j = start.col; j <= end.col; j++) {
                if (color != paper[i][j]) {
                    return false;
                }
            }
        }

        return true;
    }
}

class Location {
    public int row;
    public int col;

    public Location(int row, int col) {
        this.row = row;
        this.col = col;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
Last Updated: 1/3/2021, 2:26:34 PM