Competition/Baekjoon

[백준] 1780번 종이의 개수

bisi 2020. 3. 31. 11:45
문제 출처 

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

 

1780번: 종이의 개수

N×N크기의 행렬로 표현되는 종이가 있다. 종이의 각 칸에는 -1, 0, 1의 세 값 중 하나가 저장되어 있다. 우리는 이 행렬을 적절한 크기로 자르려고 하는데, 이때 다음의 규칙에 따라 자르려고 한다. 만약 종이가 모두 같은 수로 되어 있다면 이 종이를 그대로 사용한다. (1)이 아닌 경우에는 종이를 같은 크기의 9개의 종이로 자르고, 각각의 잘린 종이에 대해서 (1)의 과정을 반복한다. 이와 같이 종이를 잘랐을 때, -1로만 채워진 종이의 개수, 0으

www.acmicpc.net

 

 

 

접근 방식 및 풀이

- 3*3 배열로 계속해서 쪼개며 그안의 원소 성분에 대해서 분석한다. 

 

 

 

소스 코드 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    static int size;
    static int[] count;
    static int[][] arr;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        size= Integer.parseInt(br.readLine());
        StringTokenizer st ;
        count = new int[3];
        arr = new int[size][size];
        for (int i = 0; i <size ; i++) {
            st = new StringTokenizer(br.readLine());
            for (int j = 0; j <size ; j++) {
                // 원소별 구분 및 바로 계산이 가능하도록 +1을 한다.
                arr[i][j]=Integer.parseInt(st.nextToken()) +1;
            }
        }
        divideAndConqure(0,0,size);

        System.out.println(count[0]);
        System.out.println(count[1]);
        System.out.println(count[2]);

    }


    private static boolean isAble(int r, int c , int len){
        int t = arr[r][c];

        //하나의 숫자랑 다른 원소들이 같은 경우 이지!
        for (int i = r; i < r+len; i++) {
            for (int j = c; j < c+len; j++) {
                if(t != arr[i][j])
                    return false;
            }
        }
        return true;
    }
    private static void divideAndConqure(int r, int c , int len){
        if(isAble(r,c,len)){
            count[arr[r][c]] +=1;
        }else{
            int newLen = len/3;
            for (int i = 0; i <3 ; i++) {
                for (int j = 0; j <3 ; j++) {
                    divideAndConqure(r + newLen*i, c+newLen*j, newLen);
                }
            }
        }
    }

}

 

 

 

 

결과 

 

'Competition > Baekjoon' 카테고리의 다른 글

[백준] 2110번 자바 공유기 설치  (0) 2020.03.31
[백준] 18016번 자바 숫자 카드2  (0) 2020.03.31
[백준] 10815번 자바 숫자카드  (0) 2020.03.31