mun dev

[SWEA] D2 스도쿠 검증 자바(Java) 본문

알고리즘/SWEA

[SWEA] D2 스도쿠 검증 자바(Java)

mndev 2023. 11. 19. 00:08

문제 링크

 

SW Expert Academy

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

swexpertacademy.com

 

풀이

처음에 복잡하게 풀이했다가 간단한 풀이로 접근할 수 있었다.

1. 행, 열, 3x3의 칸을 확인한다.

2. 행 검사시 해당 행의 값들을 인덱스로 넣고 카운트를 증가한다.

3. 1부터 9까지 검사해서 0이 존재한다면 false후  break한다.

행과 마찬가지로 열과 3x3도 이와 같이 해준다면 어렵지 않게 풀이할 수 있다.

 

풀이 코드

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

public class Solution {

	public static void main(String[] args) throws NumberFormatException, IOException {

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int T = Integer.parseInt(br.readLine());

		StringTokenizer st;

		for (int testCase = 1; testCase <= T; testCase++) {
			int[][] sudoku = new int[10][10];
			boolean check = true;

			for (int i = 0; i < 9; i++) {
				st = new StringTokenizer(br.readLine(), " ");

				for (int j = 0; j < 9; j++) {
					sudoku[i][j] = Integer.parseInt(st.nextToken());
				}
			}

			for (int i = 0; i < 9; i++) { // 행 검사
				int[] arr = new int[10];

				for (int j = 0; j < 9; j++)
					arr[sudoku[i][j]]++;

				for (int k = 1; k <= 9; k++) {
					if (arr[k] == 0) {
						check = false;
						break;
					}
				}
			}

			for (int i = 0; i < 9; i++) { // 열 검사
				int[] arr = new int[10];

				for (int j = 0; j < 9; j++)
					arr[sudoku[j][i]]++;

				for (int k = 1; k <= 9; k++) {
					if (arr[k] == 0) {
						check = false;
						break;
					}
				}
			}

			for (int i = 0; i <= 6; i += 3) { // 3x3칸 검사
				for (int j = 0; j <= 6; j += 3) {
					int[] arr = new int[10];

					int a = i + 3;
					int b = j + 3;

					for (int x = i; x < a; x++) {
						for (int y = j; y < b; y++) {
							arr[sudoku[x][y]]++;
						}
					}

					for (int z = 1; z <= 9; z++) {
						if (arr[z] == 0) {
							check = false;
							break;
						}
					}
				}
			}

			int result = check ? 1 : 0;

			System.out.println("#" + testCase + " " + result);
		}
	}
}