Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 위상정렬
- 삼성청년SW아카데미
- 99일지
- dfs
- BFS
- 싸피
- 자바
- 백준
- BOJ
- java
- 백트래킹
- 항해
- 브루트포스
- 개발자스터디
- 프로그래머스
- 99클럽
- python
- ssafy
- SSAFY수료식
- 문자열
- 알고리즘
- 너비우선탐색
- til
- 코딩테스트
- DP
- programmers
- 깊이우선탐색
- 파이썬
- 다이나믹프로그래밍
- 구현
Archives
- Today
- Total
EunJng
[BOJ] 2239 스도쿠 | Python 본문
문제
백준 2239번 스도쿠 | 골드4
https://www.acmicpc.net/problem/2239
2239번: 스도쿠
스도쿠는 매우 간단한 숫자 퍼즐이다. 9×9 크기의 보드가 있을 때, 각 행과 각 열, 그리고 9개의 3×3 크기의 보드에 1부터 9까지의 숫자가 중복 없이 나타나도록 보드를 채우면 된다. 예를 들어 다
www.acmicpc.net
- 알고리즘 분류 : 구현 | 백트래킹
풀이 과정
파이썬 풀이
import sys
input = sys.stdin.readline
def row_check(row, num): # 가로 확인
for col in range(9):
if arr[row][col] == num:
# 넣을 값(num)이 이미 그 줄에 있으면 False
return False
return True
def col_check(col, num): # 세로 확인
for row in range(9):
if arr[row][col] == num:
return False
return True
def square_check(row, col, num): # 사각형 확인
r = row // 3 * 3
c = col // 3 * 3
# 각 사각형의 첫번째 행/렬로 설정(0, 3, 6 중 하나)
for a in range(3):
for b in range(3):
if arr[r+a][c+b] == num:
return False
return True
def dfs(idx):
if idx == len(zero_idx):
# 0인 값 다 채웠으면 프린트하고 함수 종료
for i in range(9):
for j in range(9):
print(arr[i][j], end="")
print()
exit()
x, y = zero_idx[idx]
# 함수 호출될 때마다 해당 인덱스의 zero_idx 값 가져와야 함
for n in range(1, 10):
if row_check(x, n) and col_check(y, n) and square_check(x, y, n):
# check 다 통과하면
arr[x][y] = n
dfs(idx+1)
arr[x][y] = 0
# rstrip() 잊지 말기
arr = [list(map(int, input().rstrip())) for _ in range(9)]
zero_idx = []
for i in range(9):
for j in range(9):
if not arr[i][j]:
zero_idx.append((i, j))
dfs(0)
- 0인 곳의 x, y좌표를 튜플 형태로 zero_idx라는 리스트에 저장
- 해당 자리에 대해 dfs 재귀함수를 통해 숫자 추가하기
- 가로, 세로, 사각형 모두 확인해서 통과하면 숫자 넣기
- idx+1하여 재귀 호출하여 그 다음 0인 좌표에 대해 탐색
- 사각형 탐색할 때는 해당 좌표가 포함된 사각형의 좌측 상단부터 9칸 조사하는 게 편하므로
0, 3, 6의 행/열에서부터 시작할 수 있도록 r, c 변수 할당
- `split()`으로 받지 않는 입력값이 오랜만이라 실수 있었다,, 주의하기!
- 메모리, 시간 줄일 수 있는 방법 고안해보기
'PROBLEM > BAEKJOON' 카테고리의 다른 글
[BOJ] 11723 집합 | Python (1) | 2023.05.02 |
---|---|
[BOJ] 2525 | 오븐 시계 | Java (0) | 2023.05.01 |
[BOJ] 2588 곱셈 | Java | Python (0) | 2023.05.01 |
[BOJ] 2480 | 주사위 세개 | Java | Python (0) | 2023.05.01 |
[BOJ] 12100번 2048 (Easy) | Python (1) | 2023.04.29 |