[백준:1780] 종이의 개수

Boknami·2023년 9월 30일
0

백준문제풀이

목록 보기
40/45

🕦 풀이시간 : 1시간

😥 실패 및 원인

직전에 풀었던 쿼드트리와 정말 크게 다른 게 없었다.
그렇기 때문에

  1. method(0,0,총 길이)
  2. 현재 타겟이 한 값으로만 가득 찼는지 확인
  3. 한 값으로만 가득차지 않았다면 분할 후 다시 method 호출

방법으로 진행했는데 이상하게 내가 원하는 값이 계속 안 찍혔다..

정말 정말 말도 안되게 바보 같았다.

  1. 입력 실수
    이 전 코드에 입력 부분을 바로 가져와서 풀었는데 나중에 보니 입력 부분이 이미 blank가 포함되어 있었기 때문에 readline 후 split을 하던지 아니면 StringTokenizer를 이용하면 바로 풀리는 문제였는데 입력 부분에서 제대로 못 받았다는 생각을 안하고 풀었다..

  2. 효율적 코드
    일단 문제를 해결하자는 마음가짐으로 접근을 하긴 했다만은 9분할에 있어 for문을 통해 효율적으로 코드를 짤 수도 있었다..반성하자


❌ 틀린코드

import java.io.*;

public class Main {
    static int[][] paper;
    static int[] papers = new int[3];
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int N = Integer.parseInt(br.readLine());
        paper = new int[N][N];

        for(int i = 0; i < N; i++) {
            String str = br.readLine();

            for(int j = 0; j < N; j++) {
                paper[i][j] = str.charAt(j) - '0';
            }
        }

        getPapers(0,0,N);
        for(int value : papers)
            System.out.println(value);
    }

    private static void getPapers(int x, int y, int depth) {
        //이건 하나가 다 통합 => 더하고 끝내자!
        if(isOne(x,y,depth)){
            if(paper[x][y] == -1)
                papers[0]++;
            else if(paper[x][y] == 0)
                papers[1]++;
            else if(paper[x][y] == 1)
                papers[2]++;
            return;
        }

        //9등분내고 다시 함수 호출!
        getPapers(x,y,depth/3);
        getPapers(x,y+depth/3,depth/3);
        getPapers(x, 2 * (y+depth/3),depth/3);

        getPapers(x+depth/3,y,depth/3);
        getPapers(x+depth/3,y+depth/3,depth/3);
        getPapers(x+depth/3, 2 * (y+depth/3),depth/3);

        getPapers(x + 2 * (x+depth/3),y,depth/3);
        getPapers(x + 2 * (x+depth/3),y+depth/3,depth/3);
        getPapers(x + 2 * (x+depth/3), 2 * (y+depth/3),depth/3);
    }

    public static boolean isOne(int x, int y, int depth){
        //모든 종이가 같은 수인가요?
        for(int i = x; i < x+depth; i++){
            for(int j = y; j < y+depth; j++){
                if(paper[x][y] != paper[i][j])
                    return false;
            }
        }
        return true;
    }
}

💡 성공 코드

import java.io.*;

public class Main {
    static int[][] paper;
    static int[] papers = new int[3];
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int N = Integer.parseInt(br.readLine());
        paper = new int[N][N];

        for(int i = 0; i < N; i++) {
            String[] input = br.readLine().split(" ");

            for (int j = 0; j < N; j++) {
                paper[i][j] = Integer.parseInt(input[j]);
            }
        }

        getPapers(0,0,N);
        for(int value : papers)
            System.out.println(value);
    }

    private static void getPapers(int x, int y, int depth) {
        // 모든 종이가 동일한 숫자로 채워져 있는 경우
        if(isOne(x, y, depth)){
            if(paper[x][y] == -1)
                papers[0]++;
            else if(paper[x][y] == 0)
                papers[1]++;
            else if(paper[x][y] == 1)
                papers[2]++;
            return;
        }

        int newDepth = depth / 3;

        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                getPapers(x + i * newDepth, y + j * newDepth, newDepth);
            }
        }
    }

    public static boolean isOne(int x, int y, int depth) {
        // 모든 종이의 숫자가 동일한지 확인
        int target = paper[x][y]; // 비교 대상 숫자를 가져옵니다.
        for (int i = x; i < x + depth; i++) {
            for (int j = y; j < y + depth; j++) {
                if (paper[i][j] != target) // paper[i][j]를 비교 대상과 비교합니다.
                    return false;
            }
        }
        return true;
    }
}

0개의 댓글