connecting the dots

[SWEA/Java] 1974 : 스도쿠 검증 본문

algorithm/SWEA

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

林 : 2021. 2. 10. 04:28

문제

swexpertacademy.com/main/code/problem/problemDetail.do

 

SW Expert Academy

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

swexpertacademy.com

난이도

D2

풀이

세로, 가로는 for문을 돌려 검증해주었고 3x3 짜리 작은 격자를 확인할 때는 [0][0] - [0][3] - [0][6] 처럼 격자의 가장 왼쪽 위의 인덱스를 파라미터로 넘겨 verifySmallGrid라는 메소드에서 검증해주었다.

코드

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

public class SW1974 {

	static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
	static StringTokenizer st;
	static int[][] puzzle = new int[9][9];
	static int[] count = new int[11];
	static int pass;
	public static void main(String[] args) throws NumberFormatException, IOException {
		int test_case = Integer.parseInt(in.readLine());
		for (int tc = 1; tc <= test_case; tc++) {
			System.out.print("#" + tc + " ");
			pass = 1;
			// 입력받기
			for (int i = 0; i < 9; i++) {
				st = new StringTokenizer(in.readLine(), " ");
				for (int j = 0; j < 9; j++) {
					puzzle[i][j] = Integer.parseInt(st.nextToken());
				}
			}
			// 세로 검증
			for (int j = 0; j < 9; j++) {
				setCountZero();
				for (int i = 0; i < 9; i++) {
					count[puzzle[i][j]]++;
					if (count[puzzle[i][j]] == 2) {
						pass = 0;
						i = 9;
						break;
					}
				}
			}
			// 가로 검증
			for (int i = 0; i < 9; i++) {
				setCountZero();
				for (int j = 0; j < 9; j++) {
					count[puzzle[i][j]]++;
					if (count[puzzle[i][j]] == 2) {
						pass = 0;
						i = 9;
						break;
					}
				}
			}
			// 작은 격자 검증
			for(int i = 0; i < 9; i += 3) {
				for(int j = 0; j < 9; j += 3) {
					int result = verifySmallGrid(i , j);
					if(result == 0) {
						pass = 0;
						i = 9;
						break;
					}
				}
			}
			//모든 검증 통과
			System.out.println(pass);
		}
	}

	// x,y 지점으로부터 3x3만큼을 검증
	private static int verifySmallGrid(int x, int y) {
		setCountZero();
		for(int i = x; i < x+3; i++) {
			for(int j = y; j < y+3; j++) {
				count[puzzle[i][j]]++;
				if(count[puzzle[i][j]] == 2) {
					return 0;
				}
			}
		}
		return 1;
	}

	private static void setCountZero() {
		for (int i = 0; i < 11; i++) {
			count[i] = 0;
		}
	}

}

 

느낀점

이중 for문을 빠져나올 때 loop에 이름을 붙여주고 break;하는 방법도 있지만 가장 바깥 for문이 범위를 벗어나도록 하는 방법도 있음을 알게 됐다 

'algorithm > SWEA' 카테고리의 다른 글

[SWEA/Java] 1707 : 프로세서 연결하기  (0) 2021.03.19
[SWEA/Java] 1247 : 최적경로  (0) 2021.02.18
[SWEA / Java] 1861 : 정사각형 방  (0) 2021.02.08
[SWEA / Java] 1208 : Flatten  (0) 2021.02.07
[SWEA / Java] 1210 : Ladder1  (0) 2021.02.07