-
1974. 스도쿠 검증 - 자바(JAVA)알고리즘/SW Expert Academy 2022. 4. 3. 00:01
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5Psz16AYEDFAUq
문제 해석
9 x 9칸으로 이루어져 있는 표에 1~9까지의 숫자를 채워 넣는 퍼즐이다.
같은 줄에 1~9까지의 숫자를 한번씩만 넣고, 3 x 3 크기의 작은 격자 또한, 1~9까지의 숫자가 겹치지 않아야 합니다
위와 같이 겹치는 숫자가 없을 경우 정답으로 1을 출력하고 그렇지 않을 경우 0을 출력합니다.
문제 풀이 전 설계
2차원 행렬을 순회하면서 스도쿠가 유효한지 검사합니다.
1. 가로 숫자가 겹치는지 확인합니다.
2. 세로 숫자가 겹치는지 확인합니다.
3. 인접한 주위 9칸의 숫자가 겹치는지 확인합니다.
Set 자료구조를 사용한 중복검사
코드
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.HashSet; import java.util.Set; import java.util.StringTokenizer; public class Solution_1974_스도쿠검증 { static final int BOARD_SIZE = 9; static int[][] board; static boolean isSudokuValid; public static void main(String[] args) throws NumberFormatException, IOException { // TODO Auto-generated method stub BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int T = Integer.parseInt(br.readLine()); StringBuilder sb = new StringBuilder(); for (int tc = 1; tc <= T; tc++) { board = new int[BOARD_SIZE][BOARD_SIZE]; for (int y = 0; y < BOARD_SIZE; y++) { StringTokenizer st = new StringTokenizer(br.readLine(), " "); for (int x = 0; x < BOARD_SIZE; x++) { board[y][x] = Integer.parseInt(st.nextToken()); } } isSudokuValid = true; checkSudoKuValid(); int result = isSudokuValid ? 1 : 0; sb.append("#" + tc + " " + result + "\n"); } System.out.println(sb); } private static void checkSudoKuValid() { for (int y = 0; y < BOARD_SIZE; y++) { for (int x = 0; x < BOARD_SIZE; x++) { if (!isSudokuValid(y, x)) { isSudokuValid = false; break; } } } } private static boolean isSudokuValid(int y, int x) { Set<Integer> set = new HashSet<Integer>(); // 세로 검증 for (int dy = 0; dy < BOARD_SIZE; dy++) { set.add(board[dy][x]); } if (set.size() != BOARD_SIZE) { return false; } set.clear(); // 가로 검증 for (int dx = 0; dx < BOARD_SIZE; dx++) { set.add(board[y][dx]); } if (set.size() != BOARD_SIZE) { return false; } set.clear(); // 3x3구역 검증 int tempY = y / 3 * 3; int tempX = x / 3 * 3; for (int dy = tempY; dy < tempY + 3; dy++) { for (int dx = tempX; dx < tempX + 3; dx++) { set.add(board[dy][dx]); } } if (set.size() != BOARD_SIZE) { return false; } set.clear(); return true; } }
'알고리즘 > SW Expert Academy' 카테고리의 다른 글
7465. 창용 마을 무리의 개수 - 자바(JAVA) (0) 2022.04.09 1238. [S/W 문제해결 기본] 10일차 - Contact (0) 2022.04.06 1247. [S/W 문제해결 응용] 3일차 - 최적 경로 (0) 2022.04.01 4012. [모의 SW 역량테스트] 요리사 (0) 2022.03.28 6808. 규영이와 인영이의 카드게임 - 자바(JAVA) (0) 2022.03.19