반응형
출처: SWEA
Input
10
7 3 6 4 2 9 5 8 1
5 8 9 1 6 7 3 2 4
2 1 4 5 8 3 6 9 7
8 4 7 9 3 6 1 5 2
1 5 3 8 4 2 9 7 6
9 6 2 7 5 1 8 4 3
4 2 1 3 9 8 7 6 5
3 9 5 6 7 4 2 1 8
6 7 8 2 1 5 4 3 9
Output
#1 1
스도쿠 검증하는 문제이다.
9x9판에서 아래 구간을 for문으로 차례대로 검사.
각 구간별로 1~9까지 숫자가 중복없이 있는지 확인.
import java.util.Scanner;
public class Solution {
static int tc;
static int[][] arr;
static boolean[] target;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int T = Integer.parseInt(sc.next());
arr = new int[10][10];
for(tc=1; tc<=T; tc++) {
// 1행부터 시작해서 모든 열의 숫자를 입력 받는다. (9x9)
for(int i=1; i<=9; i++) {
for(int j=1; j<=9; j++) {
arr[i][j] = Integer.parseInt(sc.next());
}
}
// 모든 검사를 통과해야 true로 남아 있다.
boolean answer = true;
// 모든 행,열에 대해 검사
if(checkLine()) {
printFalseAnswer();
// 다음 TestCase에 대해서 진행
continue;
}
// 각 격자에 대한 검사
if(checkGrid()) {
printFalseAnswer();
// 다음 TestCase에 대해서 진행
continue;
}
System.out.print("#" + tc + " ");
System.out.println("1");
}
}
private static boolean checkLine() {
// 1~9까지의 숫자를 의미
target = new boolean[10];
for(int i=1; i<=9; i++) {
// 하나의 행에 대한 모든 열을 살핀다.
for(int j=1; j<=9; j++) {
// 숫자가 중복되었다면 종료
if(target[arr[i][j]]) {
return true;
}
target[arr[i][j]] = true;
}
// 재검사를 위해 다시 초기화 시켜준다.
target = new boolean[10];
// 하나의 열에 대한 모든 행을 살핀다.
for(int j=1; j<=9; j++) {
// 숫자가 중복되었다면 종료
if(target[arr[j][i]]) {
return true;
}
target[arr[j][i]] = true;
}
// 재검사를 위해 다시 초기화 시켜준다.
target = new boolean[10];
}
// 모든 라인 검사에 문제가 없다면.
return false;
}
private static boolean checkGrid() {
int[][] index = {
{2,2}, {2,5}, {2,8},
{5,2}, {5,5}, {5,8},
{8,2}, {8,5}, {8,8}
};
int[] change_x = {-1,-1,-1, 0, 0, 0, 1, 1, 1};
int[] change_y = {-1,0,1, -1,0,1, -1,0,1};
// 1~9까지의 숫자를 의미
target = new boolean[10];
for(int idx=0; idx<9; idx++) {
int mid_x = index[idx][0];
int mid_y = index[idx][1];
for(int i=0; i<9; i++) {
int next_x = mid_x + change_x[i];
int next_y = mid_y + change_y[i];
if(target[arr[next_x][next_y]]) {
return true;
}
target[arr[next_x][next_y]] = true;
}
// 재검사를 위해 다시 초기화 시켜준다.
target = new boolean[10];
}
return false;
}
private static void printFalseAnswer() {
System.out.print("#" + tc + " ");
System.out.println("0");
}
}
반응형
'PS 문제 풀이 > SWEA' 카테고리의 다른 글
[SWEA] 1249 보급로 (0) | 2021.03.01 |
---|---|
[SWEA] 8382 방향 전환 (0) | 2021.03.01 |
[SWEA] 1954 달팽이 (0) | 2021.03.01 |
[SWEA] 3816 아나그램 (0) | 2021.03.01 |
[SWEA] 3819 최대 부분 배열 (0) | 2021.02.28 |
댓글