본문 바로가기

숨막히는 알고말고/문제 풀이

[SWEA] 스도쿠 검증

👀 문제 설명

문제

로그인해야 문제를 볼 수 있다.

 

✍🏻풀이

스도쿠가 유효한지 체크하는 변수 isOkay를 사용해 체크해준다.

먼저, 세로줄(행)이 유효한지 체크하고, isOkay가 false일 경우, 0을 출력하고 다음 테스트케이스로 넘긴다.

isOkay가 true일 경우, 가로줄(열)이 유효한지 체크하고, isOkay가 false일 경우, 0을 출력하고 다음 테스트케이스로 넘긴다.

isOkay가 true일 경우, 3 x 3을 체크한다.

3 x 3의 왼쪽 위 좌표를 사용해서, 해당 좌표부터 3 x 3 사각형을 체크하면 된다.

 

나는 중간 중간 isOkay를 확인하고 다음으로 넘겼는데, 그냥 마지막에서 체크해줘도 제대로 동작한다.

 

코드

package swea;

// 스도쿠 검증 (https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5Psz16AYEDFAUq&categoryId=AV5Psz16AYEDFAUq&categoryType=CODE&problemTitle=%EC%8A%A4%EB%8F%84%EC%BF%A0&orderBy=FIRST_REG_DATETIME&selectCodeLang=ALL&select-1=&pageSize=10&pageIndex=1 )

import java.io.*;
import java.util.*;

public class SWEA_1974 {
	
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringTokenizer st;
		int T = Integer.parseInt(br.readLine());

		for (int tc = 1; tc <= T; tc++) {
			// input
			int[][] board = new int[9][9];
			
			for (int i = 0; i < 9; i++) {
				st = new StringTokenizer(br.readLine());
				
				for (int j = 0; j < 9; j++) {
					board[i][j] = Integer.parseInt(st.nextToken());
				}
			}
			
			// solve
			boolean isOkay = true; // 스도쿠가 유효한지 체크하는 변수
			
			// 세로 확인
			for (int i = 0; i < 9; i++) {
				int[] check = new int[10];
				
				for (int j = 0; j < 9; j++) {
					check[board[i][j]] = 1;
				}
				
				for (int j = 1; j <= 9; j++) {
					if (check[j] != 1) {
						isOkay = false;
						break;
					}
				}
			}
			
			// 세로 확인 후, isOkay가 false로 바꼈다면, 0을 출력하고 다음 테스트케이스로 넘긴다.
			if (!isOkay) {
				bw.write("#" + tc + " " + 0 + "\n");
				continue;
			}
			
			// 가로 확인
			for (int j = 0; j < 9; j++) {
				int[] check = new int[10];
				
				for (int i = 0; i < 9; i++) {
					check[board[i][j]] = 1;
				}
				
				for (int i = 1; i <= 9; i++) {
					if (check[i] != 1) {
						isOkay = false;
						break;
					}
				}
			}

			// 가로 확인 후, isOkay가 false로 바꼈다면, 0을 출력하고 다음 테스트케이스로 넘긴다.
			if (!isOkay) {
				bw.write("#" + tc + " " + 0 + "\n");
				continue;
			}
			
			// 3 x 3 체크
			for (int i = 0; i < 9; i += 3) {
				for (int j = 0; j < 9; j += 3) {
					int[] check = new int[10];
					
					for (int w = i; w < i + 3; w++) {
						for (int h = j; h < j + 3; h++) {
							check[board[w][h]] = 1;
						}
					}
					
					for (int k = 1; k <= 9; k++) {
						if (check[k] != 1) {
							isOkay = false;
							break;
						}
					}
				}
			}
			
			// 3 x 3 확인 후, isOkay가 false로 바꼈다면, 0을 출력하고 다음 테스트케이스로 넘긴다.
			if (!isOkay) {
				bw.write("#" + tc + " " + 0 + "\n");
			}
			else { // 유효할 경우, 1 출력
				bw.write("#" + tc + " " + 1 + "\n");
			}
		}

		bw.flush();
		bw.close();
	}

}