https://www.swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5Psz16AYEDFAUq&categoryId=AV5Psz16AYEDFAUq&categoryType=CODE

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

www.swexpertacademy.com

 

풀이

    1. 가로, 세로, 3X3격자칸을 검사하는 함수를 각각 만들어주었다.
    2. 검사 중 하나라도 겹치는 숫자를 가지고 있다면 0을 출력하고 다음 테스트 케이스로 넘어간다.
    3. 각 check함수에서는 check 배열을 만들어서 해당 숫자칸이 이미 true이면 false를 리턴한다. 그렇지 않으면 check배열의 해당 인덱스 값을 true로 바꿔준다.
    4. 격자칸의 경우 각 격자칸의 시작점(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

+ Recent posts