https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5Psz16AYEDFAUq
1. 서론
종이도 생각도 필요 없을 만큼 쉽다...! 다만 배열 범위를 여기저기 넘나들어야 하기 때문에 그것만 주의하면 될 듯.(범위에 대해서)
2. 문제 풀이
9x9 배열이 주어진다. 이 배열에 적힌값들이 스도쿠의 규칙에 맞는지 점검해보는 문제이다.
스도쿠에는 한 줄에 1~9의 값이 모두 적혀 있어야 하고 중복이 있으면 안 된다. (가로, 세로, 9칸)
나는 그냥 간단하게 계수정렬을 이용했다. 가로로, 세로로, 9칸을 돌면서 그 값을 카운트해주고, 만약 스도쿠의 규칙에 맞다면 각 항목의 값이 전부 1이어야 하지만 그 이상인 값이 있는 경우는 중복, 즉 스도쿠의 규칙에 어긋나기 때문에 틀린 것이다.
이때 9칸씩 옮기는 범위를 설정하는 것은 요며칠 계속 풀었던 문제들에서 응용했다.
https://coding-log.tistory.com/155?category=954740
3. 코드 설명
import java.util.*;
public class Solution {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
int t = s.nextInt();
for (int k = 0; k < t; k++)
{
int[][] a = new int[9][9];
for (int i = 0; i < 9; i++)
for (int j = 0; j < 9; j++)
a[i][j] = s.nextInt();
int rslt = 1;
for (int i = 0; i < 9; i++) {
int[] tmp = new int[11];
for (int j = 0; j < 9; j++)
tmp[a[i][j]]++;
for (int j = 1; j <= 10; j++)
if (tmp[j] > 1)
rslt = 0;
}
for (int i = 0; i < 9; i++) {
int[] tmp = new int[11];
for (int j = 0; j < 9; j++)
tmp[a[j][i]]++;
for (int j = 1; j <= 10; j++)
if (tmp[j] > 1)
rslt = 0;
}
int x = 0, y = 0, i = 0, j = 0;
while(true) {
int[] tmp = new int[11];
for (i = x; i < 3 + x; i++)
for (j = y; j < 3 + y; j++)
tmp[a[i][j]]++;
y = j;
for (j = 1; j < 10; j++)
if (tmp[j] > 1)
rslt = 0;
if (y >= 9)
y = 0; x = i;
if (x >= 7)
break;
}
System.out.println("#" + (k + 1) + " " + rslt);
}
}
}
값들을 입력 받고 가로, 세로, 9칸 순으로 체크해준다.
계수 정렬을 사용하기 위해 tmp 배열을 하나 만들어줘서 가로마다 세로마다 9칸마다의 값을 카운트해줬다.
그리고 rslt를 1로 선언해두고 스도쿠 규칙에 어긋나면 0이 되도록 했다.
0, 0
0, 3
0, 6
3, 0
...
이런 식으로 범위가 움직여야 하기 때문에 y값은 3씩, 그리고 x값은 y가 범위 끝에 다다르면 3씩 올라가게 코드를 짰다.
다른 사람들도 다 계수 정렬로 코드를 짰을까? 괜히 궁금 ㅎ
'Algorithm' 카테고리의 다른 글
[JAVA] SWEA 1289 원재의 메모리 복구하기 (0) | 2022.08.02 |
---|---|
[JAVA] 백준 1244 스위치 켜고 끄기 (0) | 2022.08.02 |
[JAVA] SWEA 1961 숫자 배열 회전 (0) | 2022.07.09 |
[JAVA] SWEA 2001 파리 퇴치 (0) | 2022.07.09 |
[JAVA] SWEA 1979 어디에 단어가 들어갈 수 있을까 (0) | 2022.07.07 |