코딩테스트/SWEA

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

yujinius 2024. 5. 18. 21:42

https://swexpertacademy.com/main/code/problem/problemDetail.do?problemLevel=2&contestProbId=AV5Psz16AYEDFAUq&categoryId=AV5Psz16AYEDFAUq&categoryType=CODE&problemTitle=&orderBy=FIRST_REG_DATETIME&selectCodeLang=ALL&select-1=2&pageSize=10&pageIndex=2

 

SW Expert Academy

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

swexpertacademy.com

 

 

설계

  • 가로, 세로, 3x3일 경우를 각각 검사해준다. 
  • 이상이 발견되었을 경우 0을 출력하고 다음 테스트 케이스로 넘어간다.  

 

포인트

  • 이상이 발견되었을 때 이중 for문을 빠져나와 test_case for문을 continue해줘야 한다.
  • 평소에는 주로 flag를 설정하여 이중 for문을 빠져나왔는데, 라벨을사용해 빠져나오는 방법을 이번 기회에 알게 되어 아래 포스팅에 정리해두었으니 참고 바란다.  

https://yujinius45.tistory.com/67

 

[Java] 자바에서 이중 for문을 빠져나오는 방법 3가지

자바 프로그래밍을 하다 보면 이중 for문을 사용하게 되는 경우가 많습니다. 하지만 특정 조건에서 이중 for문을 빠져나와야 할 때 어떻게 해야 할까요? 오늘은 자바에서 이중 for문을 빠져나오는

yujinius45.tistory.com

 

코드

////////////////////////////////////////////////////////////////
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();
		boolean flag = false;

		for (int test_case = 1; test_case <= T; test_case++) {
			// 9X9 퍼즐
			int[][] puzzle = new int[9][9];
			for (int i = 0; i < puzzle.length; i++) {
				for (int j = 0; j < puzzle[i].length; j++) {
					puzzle[i][j] = sc.nextInt();
				}
			}
			//////////

			// 가로 검사
			Loop1 :
			for (int i = 0; i < puzzle.length; i++) {
				//System.out.println("가로 검사");
				int[] visited = new int[10];
				Loop2 :
				for (int j = 0; j < puzzle[i].length; j++) {

					if (visited[puzzle[i][j]] == 0) {
						visited[puzzle[i][j]] = 1;
					} else {
						// 방문했던 것
						System.out.printf("#%d %d\n", test_case, 0);
						// System.exit(0);
						flag = true;
						break Loop1;
					}
				}
			}

			if (flag) {
				flag = false;
				continue;
			}

			// 세로 검사
			Loop3 :
			for (int i = 0; i < puzzle.length; i++) {
				//System.out.println("세로 검사");
				int[] visited = new int[10];
				Loop4 :
				for (int j = 0; j < puzzle[i].length; j++) {

					if (visited[puzzle[j][i]] == 0) {
						visited[puzzle[j][i]] = 1;
					} else {
						// 방문했던 것
						System.out.printf("#%d %d\n", test_case, 0);
						// System.exit(0);
						flag = true;
						break Loop3;
					}
				}
			}

			if (flag) {
				flag = false;
				continue;
			}

			// 3x3 검사
			Loop5:
			for (int i = 0; i < puzzle.length; i += 3) {
				//System.out.println("3x3 검사");
				
				for (int j = 0; j < puzzle[i].length; j += 3) {
					// 3x3
					//System.out.println(i+""+j);
					int[] visited = new int[10];
					for (int n = 0; n < 3; n++) {
						for (int k = 0; k < 3; k++) {
							if (visited[puzzle[i + n][j + k]] == 0) {
								visited[puzzle[i + n][j + k]] = 1;
							} else {
								// 방문했던 것
								System.out.printf("#%d %d\n", test_case, 0);
								// System.exit(0);
								flag = true;
								break Loop5;
							}
						}
					}
				}
			}
			if (flag) {
				flag = false;
				continue;
			}

			System.out.printf("#%d %d\n", test_case,1);
		}
	}
}