문제 링크
https://swexpertacademy.com/main/code/problem/problemDetail.do
문제
스도쿠는 숫자퍼즐로, 가로 9칸 세로 9칸으로 이루어져 있는 표에 1 부터 9 까지의 숫자를 채워넣는 퍼즐이다.
같은 줄에 1 에서 9 까지의 숫자를 한번씩만 넣고,
3 x 3 크기의 작은 격자 또한, 1 에서 9 까지의 숫자가 겹치지 않아야 한다.
입력으로 9 X 9 크기의 스도쿠 퍼즐의 숫자들이 주어졌을 때,
위와 같이 겹치는 숫자가 없을 경우, 1을 정답으로 출력하고 그렇지 않을 경우 0 을 출력한다.
[제약 사항]
1. 퍼즐은 모두 숫자로 채워진 상태로 주어진다.
2. 입력으로 주어지는 퍼즐의 모든 숫자는 1 이상 9 이하의 정수이다.
입력
입력은 첫 줄에 총 테스트 케이스의 개수 T가 온다.
다음 줄부터 각 테스트 케이스가 주어진다.
테스트 케이스는 9 x 9 크기의 퍼즐의 데이터이다.
출력
테스트 케이스 t에 대한 결과는 “#t”을 찍고, 한 칸 띄고, 정답을 출력한다.
(t는 테스트 케이스의 번호를 의미하며 1부터 시작한다.)
예제
입력
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
…
출력
#1 1
...
정답 및 풀이
t = int(input())
for tc in range(t):
arr = [list(map(int, input().split())) for _ in range(9)]
result = 1
for i in range(9):
for a in range(9):
for b in range(a + 1, 9):
if arr[a][i] == arr[b][i]:
result = 0
break
for c in range(9):
for d in range(c + 1, 9):
if arr[i][c] == arr[i][d]:
result = 0
break
for r in range(0,9,3):
for c in range(0,9,3):
box=[]
for i in range(3):
for j in range(3):
box.append(arr[r+i][c+j])
for a in range(9):
for b in range(a+1,9):
if box[a]==box[b]:
result=0
break
print(f'#{tc + 1} {result}')
- t = int(input())
- 테스트 케이스 개수를 입력받는다.
- arr = [list(map(int, input().split())) for _ in range(9)]
- 9×9 스도쿠 판을 입력받아 2차원 리스트로 저장한다.
- result = 1
- 스도쿠가 올바르면 1, 틀리면 0을 출력하기 위해 기본값을 1로 설정한다.
- for i in range(9):
- 각 행과 열을 i 인덱스로 검사한다.
- 열 검사
- 같은 열(i번 열)에서 값이 중복되는지 검사한다.
- for a in range(9): for b in range(a + 1, 9): if arr[a][i] == arr[b][i]: result = 0 break
- 행 검사
- 같은 행(i번 행)에서 값이 중복되는지 검사한다.
- for c in range(9): for d in range(c + 1, 9): if arr[i][c] == arr[i][d]: result = 0 break
- 3×3 박스 반복 시작
- r, c를 3씩 증가시키면서 3×3 박스의 시작 좌표를 잡는다.
- for r in range(0,9,3): for c in range(0,9,3): box=[]
- 박스 내부 숫자 수집
- 해당 3×3 박스의 값 9개를 box 리스트에 담는다.
- for i in range(3): for j in range(3): box.append(arr[r+i][c+j])
- 박스 중복 검사
- 박스 안에서 같은 숫자가 두 번 나오면 스도쿠가 잘못된 것이다.
- for a in range(9): for b in range(a+1,9): if box[a]==box[b]: result=0 break
- print(f'#{tc + 1} {result}')
- 테스트 케이스 번호와 결과(1 또는 0)를 출력한다.
다른 풀이
t = int(input())
for tc in range(1, t + 1):
arr = [list(map(int, input().split())) for _ in range(9)]
result = 1
# 1. 가로, 세로 검사
for i in range(9):
row = set()
col = set()
for j in range(9):
row.add(arr[i][j])
col.add(arr[j][i])
if len(row) != 9 or len(col) != 9:
result = 0
break
# 2. 3×3 박스 검사
if result == 1:
for r in range(0, 9, 3):
for c in range(0, 9, 3):
box = set()
for i in range(3):
for j in range(3):
box.add(arr[r+i][c+j])
if len(box) != 9:
result = 0
break
print(f'#{tc} {result}')
'SWEA' 카테고리의 다른 글
| [SWEA] 1979 : 어디에 단어가 들어갈 수 있을까 (Python/파이썬) (0) | 2025.11.19 |
|---|---|
| [SWEA] 2007 : 패턴 마디의 길이 (Python/파이썬) (0) | 2025.11.19 |
| [SWEA] 2072 : 홀수만 더하기 (Python/파이썬) (0) | 2025.11.18 |
| [SWEA] 1204 : 최빈수 구하기 (Python/파이썬) (0) | 2025.11.18 |
| [SWEA] 2072 : 홀수만 더하기 (Python/파이썬) (0) | 2025.11.15 |