9X9 크기의 스도쿠 퍼즐이 주어졌을 때, 1부터 9까지의 숫자가 겹치지 않으면 1 출력, 그렇지 않으면 0 출력
스도쿠
가로줄, 세로줄, 3X3격자에서 1부터 9까지의 숫자가 겹치지 않고 들어가야 한다.
[제약 사항]
1. 퍼즐은 모두 숫자로 채워진 상태로 주어짐
2. 입력으로 주어지는 퍼즐의 모든 숫자는 1이상 9이하의 정수
9개의 숫자가 다 들어가는지 일일히 확인하는 방식으로 풀었다.
ck라는 이름의 9칸짜리 배열을 하나 만들어 인덱스를 증가시켜 1이 아니면 flag가 0이 되도록 만들었다.
가로줄, 세로줄은 한번에 한줄씩 검사하는 게 간단했는데 격자를 확인하는 방법이 어려웠다.
격자가 9개인데 반복문을 9개 만들면 너무 코드가 길어져서 세로로 3개씩 처리하기로 했다.
가로로 숫자 3개씩, 세로로 숫자 3개씩 검사하면 격자 하나가 완성이다.
처음에 flag를 1로 초기화시켜놓고 검사할때마다 스도쿠가 아니면 0으로 만든다.
사실상 flag가 0이되면 밑에서 검사하는 건 의미가 없으므로 바로 끝나게 만들고 싶었는데 goto썼다가 swea 컴파일러에서 오류났다.
#include <stdio.h>
int main(void) {
int T;
scanf("%d", &T);
for (int test_case = 1; test_case <= T; test_case++) {
int n[9][9] = { 0 }, flag = 1;
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
scanf("%d", &n[i][j]);
}
}
//가로줄
for (int i = 0; i < 9; i++) {
int ck[9] = { 0 };
for (int j = 0; j < 9; j++) {
ck[n[i][j]-1]++;
}
for (int j = 0; j < 9; j++) {
if (ck[j] != 1) {
flag = 0;
}
}
}
//세로줄
for (int i = 0; i < 9; i++) {
int ck[9] = { 0 };
for (int j = 0; j < 9; j++) {
ck[n[j][i] - 1]++;
}
for (int j = 0; j < 9; j++) {
if (ck[j] != 1) {
flag = 0;
}
}
}
//격자 (1,4,7번째)
int ck[9] = { 0 };
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 3; j++) {
ck[n[i][j]-1]++;
}
if ((i + 1) % 3 == 0) {
for (int j = 0; j < 9; j++) {
if (ck[j] != 1) {
flag = 0;
}
}
for (int j = 0; j < 9; j++) ck[j] = 0;
}
}
//격자 (2, 5, 8번째)
for (int j = 0; j < 9; j++) ck[j] = 0;
for (int i = 0; i < 9; i++) {
for (int j = 3; j < 6; j++) {
ck[n[i][j]-1]++;
}
if ((i + 1) % 3 == 0) {
for (int j = 0; j < 9; j++) {
if (ck[j] != 1) {
flag = 0;
}
}
for (int j = 0; j < 9; j++) ck[j] = 0;
}
}
//격자 (3, 6, 9번째)
for (int j = 0; j < 9; j++) ck[j] = 0;
for (int i = 0; i < 9; i++) {
for (int j = 6; j < 9; j++) {
ck[n[i][j]-1]++;
}
if ((i + 1) % 3 == 0) {
for (int j = 0; j < 9; j++) {
if (ck[j] != 1) {
flag = 0;
}
}
for (int j = 0; j < 9; j++) ck[j] = 0;
}
}
if (flag == 0) {
printf("#%d %d\n", test_case, flag);
}
else {
printf("#%d %d\n", test_case, flag);
}
}
return 0;
}
격자만 효율적으로 처리할 수 있었다면 더 좋았을 것 같다.
우선 통과는 떴는데, 댓글을 보니 테스트케이스가 10개라 그런지 빈약한 부분이 있는 것 같다.
나는 인덱스로 숫자가 다 있는지 확인했기 때문에 아마 반례는 없을 것 같다. 스도쿠 정의대로 만들었으니 맞겠지 뭐...
'SWEA > [D2]' 카테고리의 다른 글
[C] SWEA 2007 패턴 마디의 길이 (0) | 2022.03.03 |
---|---|
[C언어] SWEA 2005 파스칼의 삼각형 (0) | 2022.03.01 |
[C언어] SWEA 1984 중간 평균값 구하기 (0) | 2022.03.01 |
[C언어] SWEA 1285 아름이의 돌 던지기 (0) | 2022.03.01 |
[C언어] SWEA 1288 새로운 불면증 치료법 (0) | 2022.02.27 |