[백준 1780] 종이의 개수

One-nt·2022년 7월 19일
0

백준

목록 보기
6/19

문제 출처

사용 언어: Java

  1. 구상
  • 시작 위치와 정방행렬의 크기를 제시하고 숫자 검사

  • 각 수마다 개수를 세는 변수를 선언하고 같은 수로만 채워져 있는 경우에 개수 더하기

  1. 구현
import java.util.*;
import java.io.*;

public  class Main {	
	
	public static int[][] arr;
	public static int minus = 0;
	public static int zero = 0;
	public static int one = 0;
	
	public static void main(String[] args) throws Exception {
		Scanner s = new Scanner(System.in);
		
		int size = s.nextInt();
		
		//행렬 크기 설정
		arr = new int[size][size];
		
		//행렬 입력
		for (int i = 0; i < size; i++) {
			for (int j = 0; j < size; j++) {
				arr[i][j] = s.nextInt();
			}
		}
		
		
		//처음 사이즈부터 검사 및 분할
		part(0, 0, size);
		
		System.out.println(minus);
		System.out.println(zero);
		System.out.println(one);
		
	}
	
	
	//행렬 자르기
	 public static void part(int row, int col, int size) {
		 //같은 수로 되어있다면 카운트하기 
		 if(check(row, col, size)) {
			 if(arr[row][col] == -1) {				 
				 minus++;
			 }				
			 
			 else if (arr[row][col] == 0)
				 zero++;
			 
			 else
				 one++;
			 
			 return;
		 }
		 
		 
		 //9등분 후, 크기 초기화
		 size /= 3;
		 
		 part(row, col, size); 
		 part(row, col + size, size);
		 part(row, col + size*2, size);
		 
		 part(row + size, col, size);
		 part(row + size, col + size, size);
		 part(row + size, col + size * 2, size);
		 
		 part(row + size * 2, col, size);
		 part(row + size * 2, col + size, size);
		 part(row + size * 2, col + size * 2, size);		 
		 
	 }
	 
	 //같은 수로 되어있는지 확인하기
	 public static boolean check(int row, int col, int size) {
		 int num = arr[row][col];
		 
		 for (int i = row; i < row + size; i++) {
			 for (int j = col; j < col + size; j++) {				 
				 if (num != arr[i][j])
					 return false;
			 }
		 }
		 
		 return true;
	 }

} 

코드 참고

- 2차원 배열로 정방행렬 입력받고 저장

- 시작 위치와 행렬의 크기를 입력으로 받고 같은 수로 되어있다면 개수를 올림

- 검사가 끝나면 행렬을 9등분하여 각각 재귀호출로 검사 및 개수 올리기

-행렬이 같은 수로 구성되어 있는지 확인하는 메소드 따로 구현 (check)

0개의 댓글