풀이
- 가로, 세로, 3X3격자칸을 검사하는 함수를 각각 만들어주었다.
- 검사 중 하나라도 겹치는 숫자를 가지고 있다면 0을 출력하고 다음 테스트 케이스로 넘어간다.
- 각 check함수에서는 check 배열을 만들어서 해당 숫자칸이 이미 true이면 false를 리턴한다. 그렇지 않으면 check배열의 해당 인덱스 값을 true로 바꿔준다.
- 격자칸의 경우 각 격자칸의 시작점(0,0), (0,3), (0,6), (3,0), ,,, ,(6,6),(6,9) 에서 부터 시작하여 3X3칸을 검사하도록 했다.
import java.io.*; import java.util.StringTokenizer; public class Solution { static int[][] puzzle; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int T = Integer.parseInt(br.readLine()); for(int tc=1; tc<=T; tc++) { puzzle = new int[9][9]; for(int i=0; i<9; i++) { StringTokenizer st = new StringTokenizer(br.readLine()); for(int j=0; j<9; j++) { puzzle[i][j] = Integer.parseInt(st.nextToken()); } } boolean flag = true; //모든 가로를 검사한다. for(int i=0; i<9; i++) { if(!checkGaro(i)) { //한줄이라도 false이면 검사를 멈춘다. System.out.println("#"+tc+" "+0); flag = false; break; } } if(!flag) continue; //다음 테스트 케이스 실행 //모든 세로를 검사 for(int j=0; j<9; j++) { if(!checkSero(j)) { System.out.println("#"+tc+" "+0); flag = false; break; } } if(!flag) continue; //다음 테스트 케이스 실행 //모든 3X3 격자칸 검사 //격자칸의 각 시작점에서부터 검사 for(int i=0; i<=6; i+=3) { //3칸씩 점프 (다음 격자칸 이동을 위해) for(int j=0; j<=6; j+=3) { if(!checkNemo(i,j)) { System.out.println("#"+tc+" "+0); flag = false; break; } } if(!flag) break; } if(!flag) continue; //위에서 모두 검사를 통과했다면 1을 출력 System.out.println("#"+tc+" "+1); } } static boolean checkGaro(int x) { boolean[] check = new boolean[9]; for(int j=0; j<9; j++) { // x행에 대하여 모든 j열을 검사. if(check[puzzle[x][j]-1]) //이미 해당 숫자를 가지고 있다. return false; check[puzzle[x][j]-1] = true; } return true; } static boolean checkSero(int y) { boolean[] check = new boolean[9]; for(int i=0; i<9; i++) { // y열에 대하여 모든 i행을 검사. if(check[puzzle[i][y]-1]) //이미 해당 숫자를 가지고 있다. return false; check[puzzle[i][y]-1] = true; } return true; } static boolean checkNemo(int x, int y) { boolean[] check = new boolean[9]; int nx = x+3; int ny = y+3; //x행 y열에서 시작하는 3X3 칸을 검사. for(int i=x; i<nx; i++) { for(int j=y; j<ny; j++) { if(check[puzzle[i][j]-1]) //이미 해당 숫자를 가지고 있다. return false; check[puzzle[i][j]-1] = true; } } return true; } }
'SWEA > D2' 카테고리의 다른 글
[SWEA] 1959. 두 개의 숫자열 (0) | 2019.05.14 |
---|---|
[SWEA] 1961. 숫자 배열 회전 (0) | 2019.05.14 |
[SWEA] 1970. 쉬운 거스름돈 (0) | 2019.05.03 |
[SWEA] 1979. 어디에 단어가 들어갈 수 있을까 (0) | 2019.05.02 |
[SWEA] 1976. 시각 덧셈 (0) | 2019.05.02 |