[Java] SWEA 1974번: 스도쿠 검증

U·2023년 7월 14일

SWEA

목록 보기
4/10

문제

스도쿠는 숫자 퍼즐로, 가로 9칸 세로 9칸으로 이루어져 있는 표에 1부터 9까지의 숫자를 채워넣는 퍼즐이다.

같은 줄에 1에서 9까지의 숫자를 한번씩만 넣고, 3 x 3 크기의 작은 격자 또한, 1에서 9까지의 숫자가 겹치지 않아야 한다.

입력으로 9 X 9 크기의 스도쿠 퍼즐의 숫자들이 주어졌을 때, 위와 같이 겹치는 숫자가 없을 경우, 1을 정답으로 출력하고 그렇지 않을 경우 0 을 출력한다.

[제약 사항]

  1. 퍼즐은 모두 숫자로 채워진 상태로 주어진다.

  2. 입력으로 주어지는 퍼즐의 모든 숫자는 1 이상 9 이하의 정수이다.

[입력]

입력은 첫 줄에 총 테스트 케이스의 개수 T가 온다.

다음 줄부터 각 테스트 케이스가 주어진다.

테스트 케이스는 9 x 9 크기의 퍼즐의 데이터이다.

[출력]

테스트 케이스 t에 대한 결과는 “#t”을 찍고, 한 칸 띄고, 정답을 출력한다.

(t는 테스트 케이스의 번호를 의미하며 1부터 시작한다.)


일단 이해하자🤔

  • 정말 오랫동안 붙잡고 있었던 문제다. 일단 2차원 배열에 9 x 9 스도쿠 숫자들을 넣고 같은 (1) 행 (2) 열 (3) 3 x 3 정사각형에서 1부터 9까지 겹치는 수가 없어야 한다. 즉, 1부터 9까지 수가 하나씩 들어가야 한다는 말이다.
  • 행과 열을 검증하는 부분은 잘 해결했으나, 정사각형 부분 로직 구현하는데에 오래걸려서 중간에 구글에서 참고를 했으나 결국 내가 생각한 로직으로 구현에 성공했다! 구글 코드를 참고하고 문제를 어떻게 해결해야 할지 덕분에 깨달은 것 같다. 앞으로 풀이에 너무 오래 걸린다면 다른 사람의 코드를 참고한 뒤, 내가 생각한 로직에 적용할 수 있도록 해봐야겠다.
  • 정확한 코드의 내용은 주석으로 적어놓겠다.

👀 풀이

import java.util.Scanner;
import java.io.FileInputStream;

class Solution {
	public static void main(String args[]) throws Exception {
		Scanner sc = new Scanner(System.in);
		int T;
		T = sc.nextInt(); // 테스트 케이스 T 입력 받기
		int arr[][] = new int[9][9]; // 9 x 9 스도쿠를 넣을 배열 생성

		for (int test_case = 1; test_case <= T; test_case++) { 
			int answer = 1;

			// 배열 arr에 9 x 9 스도쿠 넣는 부분
			for (int i = 0; i < 9; i++) {
				for (int j = 0; j < 9; j++) {
					arr[i][j] = sc.nextInt();
				}
			}

			// 행, 열 1~9의 수가 있는지 검증
			for (int i = 0; i < 9; i++) {
				int rowSum = 0;
				int colSum = 0;
				for (int j = 0; j < 9; j++) {
					rowSum += arr[i][j]; // 세로 줄 검증 : rowSum에 합 더하기
					colSum += arr[j][i]; // 가로 줄 검증  : colSum에 합 더하기
                    // 따라서 i, j가 각각 반대로 들어감
				}

				if (rowSum != 45 || colSum != 45) { // 1부터 9까지 더한 값은 45
					answer = 0;
					break; // 반복문 탈출
				}
			}
			
			if (answer == 0) { // 행, 열 검증 후 0일 경우 출력 후 반복문 탈출
				System.out.println("#" + test_case + " " + answer);
				continue;
			}
			
            // 3 x 3 정사각형 1~9의 수가 있는지 검증
			for (int i = 1; i <= 3; i++) {
				int squareSum = 0;
				for (int j = (i - 1) * 3; j < i * 3; j++) {
					for (int k = (i - 1) * 3; k < i * 3; k++) {
							squareSum += arr[j][k];
						}
					}
					if (squareSum != 45) { // 1부터 9까지 더한 값은 45
						answer = 0;
						break; // 반복문 탈출
					}
				if (answer == 0) {
					break;
				}
			}
			
			System.out.println("#" + test_case + " " + answer);
		}
	}
}
profile
백엔드 개발자 연습생

0개의 댓글