본문 바로가기

백준/백준

[백준 1780] 종이의 개수

문제    www.acmicpc.net/problem/1780






풀이


( 1 ) 문제 쪼개기


기준점(x,y)과 크기(size)를 잡고

주어진  N*N 배열을 9등분한다.

nS = size/3

- ( x , y ,        nS ) ( x+nS , y       , nS )   ( x+2nS , y         , nS ) 

  ( x , y+ nS ,  nS ) ( x+nS , ynS , nS )  ( x+2nS , y + nS   , nS )

  ( x , y+2nS , nS ) ( x+nS , y+2nS , nS )  ( x+2nS , y + 2nS , nS )


 0  

-1 

-1 

-1 

-1 

-1 

-1 

0

1

-1 

-1 

-1 

 1 

-1 

-1 

-1 

-1 

-1 

-1 

-1 

-1 

-1 



(2) 확인하기


각각의 구역에 대해서 확인하고, 

해당 구역 내의 모든 값이 동일할 경우 그대로 출력한다.

해당 구역 내의 값이 다를 경우 (1)을 반복한다.



 0  

-1 

 1 

-1 

-1 

-1 

-1 

-1 

-1 

-1 

-1 

-1 


코드

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
/*
 *  Coded by Handal ( 2019.02 )
 */
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
 
public class Main {
    static BufferedReader brr = new BufferedReader(new InputStreamReader(System.in));
    static int[][] paper;
    static int[] cutedPapers = new int[3];
    static StringTokenizer stt;
 
    public static void main(String[] args) throws IOException {
        int N = Integer.parseInt(brr.readLine());
 
        paper = new int[N][N];
        for (int i = 0; i < N; i++) {
            stt = new StringTokenizer(brr.readLine());
            for (int j = 0; j < N; j++)
                paper[i][j] = Integer.parseInt(stt.nextToken());
        }
 
        cut(00, N);
        
        for(int x : cutedPapers)
            System.out.println(x);
    }
 
    static void cut(int x, int y, int size) {
        boolean b = true;
        int std = paper[x][y];
 
        for (int i = x; i < x + size && b; i++)
            for (int j = y; j < y + size && b; j++)
                if (paper[i][j] != std) b = false;
 
        if (b) 
            cutedPapers[std+1]++;
        else {
            int nS = size/3;
            
            for(int i=x;i<x+size;i+=nS)
                for(int j=y; j<y+size; j+=nS) 
                    cut(i, j, nS);
        }
    }
}
 
cs


생각해보기

같은 분할정복 문제라서 그런지 백준1992-쿼드분할 문제와 거의 다른게 없었다.

코드도 1992번 코드에서 4분할을 9분할로 변경하는 부분만 수정했다.


'백준 > 백준' 카테고리의 다른 글

[ 백준 1978 ] 소수 찾기  (0) 2019.11.03
[ 백준 9465 ] 스티커  (0) 2019.11.02
[ 백준 1002 ] 터렛  (0) 2019.11.01
[백준 1992] 쿼드트리  (0) 2019.02.08
[백준 2167 ] 2차원 배열의 합  (0) 2019.02.07