ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] 백준 1780 종이의 개수
    Programming/Algorithm 2021. 3. 5. 19:53

     

     

    문제

    잘라진 종이가 한 숫자로만 이루어져 있는지를 검사하고

    그렇다면 종이 개수를 추가하고, 아니라면 9등분으로 나눠 다시 종이 내의 숫자를 검사하는 문제이다.

    9등분으로 나누는 부분을 재귀로 처리하였다. 

     

     

    풀이

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.StringTokenizer;
    
    public class Main {
        static int N;
        static int[][] map;
        static int[] res;
    
        public static void main(String[] args) throws IOException {
            solution();
        }
    
        static void solution() throws IOException {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            N = Integer.parseInt(br.readLine());
    
            map = new int[N][N];
            for (int i = 0; i < N; i++) {
                StringTokenizer st = new StringTokenizer(br.readLine());
                for (int j = 0; j < N; j++) {
                    map[i][j] = Integer.parseInt(st.nextToken());
                }
            }
    
            res = new int[3];
            recursion(0, 0, N);
    
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < 3; i++) {
                sb.append(res[i]).append("\n");
            }
            System.out.println(sb);
        }
    
        static void recursion(int x, int y, int len) {
            boolean isSame = true;
            int number = map[x][y];
            loop:
            for (int i = x; i < x + len; i++) {
                for (int j = y; j < y + len; j++) {
                    if (map[i][j] != number) {
                        isSame = false;
                        break loop;
                    }
                }
            }
            if (isSame) {
                res[number + 1]++;
                return;
            }
    
            int nlen = len / 3;
            for (int i = 0; i < 3; i++) {
                for (int j = 0; j < 3; j++) {
                    recursion(x + i * nlen, y + j * nlen, nlen);
                }
            }
        }
    }
    

     

     

    피드백

    - 정사각형 형태이고 9등분으로 나누면 너비와 높이 모두 같은 비율로 줄어들기 때문에, nx와 ny를 굳이 나눠서 계산할 필요 없다. nlen = len/3으로 모두 처리 가능

     

     

    채점결과

    댓글

Designed by black7375.