Algorithm/Broute Force

[Java] SWEA 1974번 스도쿠 검증

코딩쪼앙 2023. 6. 29. 18:29

문제

 

SW Expert Academy

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

swexpertacademy.com

문제 풀이

  • 가로, 세로, 정사각형별로 탐색을 진행하여 겹치는 숫자가 없는지 확인한다. 두 가지 방법이 있다.
    • 1. 1부터 9까지 더한 값이 45이므로 모든 값을 더한 결과가 45가 아닌 경우 flag값을 false로 변경
    • 2. 0부터 8번지까지 있는 배열을 생성하여 스도쿠에 저장 되어있던 값들을 번지수에 저장 (저장되어있는 값이 0 ~ 8이 아닌 1 ~ 9이므로 -1번째에 저장 해야한다.)  -> 이 방법 사용
  • flag의 값이 false이면 1부터 9까지 모든 숫자가 들어있지 않은 경우이므로 0을 출력하고, true면 1을 출력한다.

코드

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

public class Solution {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int tc = Integer.parseInt(br.readLine());
		
		for (int t = 1; t <= tc; t++) {
			int[][] board = new int[9][9];
			int[] check;
			boolean flag = true;
			
			//보드 입력받기
			for (int i = 0; i < 9; i++) {
				StringTokenizer st = new StringTokenizer(br.readLine());
				for (int j = 0; j < 9; j++) {
					board[i][j] = Integer.parseInt(st.nextToken());
				}
			}
			
			// 가로 탐색
			for (int i = 0; i < 9; i++) {
				check = new int[9];
				// check배열로 모든 문자가 고르게 들어있는지 확인
				for (int j = 0; j < 9; j++) {
					check[board[i][j] - 1] = 1;
				}
				// 한 곳이라도 0이 있다면 false
				for (int k = 0; k < 9; k++) {
					if (check[k] == 0) {
						flag = false;
						break;
					}
				}
				
			}
			
			// 세로 탐색
			for (int i = 0; i < 9; i++) {
				check = new int[9];
				for (int j = 0; j < 9; j++) {
					check[board[j][i] - 1] = 1;
				}
				for (int k = 0; k < 9; k++) {
					if (check[k] == 0) {
						flag = false;
						break;
					}
				}
			}
			
			// 정사각형 탐색
			for (int i = 0; i <= 6; i+=3) {
				for (int j = 0; j <= 6; j+=3) {
					check = new int[9];
					for (int y = 0; y < i+3; y++) {
						for (int x = 0; x < j+3; x++) {
							check[board[y][x] - 1] = 1;
						}
					}
					for (int k = 0; k < 9; k++) {
						if (check[k] == 0) {
							flag = false;
							break;
						}
					}
				}
			}
			if (!flag) 
				System.out.println("#"+t+" "+0);
			else 
				System.out.println("#"+t+" "+1);
		}
		
	}
	
}