알고리즘 풀이(JAVA) - 백준 알고리즘_1780(종이의 개수)


문제

문제 링크 : https://www.acmicpc.net/problem/1780

종이의 개수

풀이

  • 앞선 쿼드 트리 문제는 배열을 반으로 계속 잘라 가며 숫자를 비교 했다면 이 문제는 배열을 1/3 로 잘라가면서 비교를 하는 방식이다. 쿼드 트리의 이해와 배열의 이해가 있으면 쉽게 풀이가 가능 하다.

    • 종이의 갯수을 카운트 하기 위한 3개의 int 변수 선언(int minus, zero, one)
    • 종이를 재귀 처리할 cut(int[][] num) 메소드 생성
      • int[][] num 배열의 숫자를 체크 해서(checkPaper(int[][] num)) 동일한 숫자 이면 탐색 종료
      • 동일한 숫자가 아닐 경우 9개의 칸으로 잘라서 다시 재귀 처리함.(2중 반복문)

소스

  • 종이의 갯수(1780)
package algorithm;

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

public class Baekjoon_1780 {
	private static int minus = 0;
	private static int zero = 0;
	private static int one = 0;
	
	public static void main(String[] args){
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        try{
        	int N = Integer.parseInt(reader.readLine());
        	int[][] paper = readData(reader, N);
        	cut(paper);
        	System.out.println(minus);
        	System.out.println(zero);
        	System.out.println(one);
        }catch(Exception e){
            e.printStackTrace();
        }
    }

	private static int[][] readData(BufferedReader reader, int N) throws IOException {
		int[][] movie = new int[N][N];
		for(int i = 0; i < N; i++) {
			String[] readStr = reader.readLine().split(" ");
			for(int j = 0; j < N; j++) {
				movie[i][j] = Integer.parseInt(readStr[j]);
			}
		}
		return movie;
	}
	
	private static void cut(int[][] num){
		if(checkPaper(num)) {
			return;
		}else {
			for (int i = 0; i < 3; i++) {
				int xS = i * num.length / 3;
				int xE = (i + 1) * num.length / 3;
				
				for (int j = 0; j < 3; j++) {
					int yS = j * num.length / 3;
					int yE = (j + 1) * num.length / 3;
					
					cut(cutPaper(num, xS, xE, yS, yE));
				}
			}
		}
	}

	private static int[][] cutPaper(int[][] num, int xS, int xE, int yS, int yE) {
		int i = 0;
		int j = 0;
		int[][] tmp = new int[num.length/3][num.length/3];
		for(int x = xS; x < xE; x++) {
			for (int y = yS; y < yE; y++) {
				tmp[i][j++] = num[x][y];
			}
			i++;
			j = 0;
		}
		return tmp;
	}
	
	private static boolean checkPaper(int[][] num) {
		int[] numCnt = new int[3];
		for(int i = 0; i < num.length; i++) {
    		for (int j = 0; j < num.length; j++) {
    			if(num[i][j] == -1) {
    				numCnt[0] += 1;
    			}else if(num[i][j] == 0) {
    				numCnt[1] += 1;
    			}else {
    				numCnt[2] += 1;
    			}
			}
    	}
		if(isNotSameNumber(numCnt)) {
			return false;
		}else {
			countNumbers(numCnt);
			return true;
		}
	}

	private static boolean isNotSameNumber(int[] numCnt) {
		if(!isMinus(numCnt) && !isZero(numCnt) && !isOne(numCnt)) {
			return true;
		}
		return false;
	}

	private static void countNumbers(int[] numCnt) {
		if(isMinus(numCnt)) {
			minus += 1;
		}
		if(isZero(numCnt)) {
			zero += 1;
		}
		if(isOne(numCnt)) {
			one += 1;
		}
	}

	private static boolean isOne(int[] numCnt) {
		return numCnt[0] == 0 && numCnt[1] == 0 && numCnt[2] > 0;
	}

	private static boolean isZero(int[] numCnt) {
		return numCnt[0] == 0 && numCnt[1] > 0 && numCnt[2] == 0;
	}

	private static boolean isMinus(int[] numCnt) {
		return numCnt[0] > 0 && numCnt[1] == 0 && numCnt[2] == 0;
	}
}

Back to blog