728x90
반응형
https://www.acmicpc.net/problem/2239
2239번: 스도쿠
스도쿠는 매우 간단한 숫자 퍼즐이다. 9×9 크기의 보드가 있을 때, 각 행과 각 열, 그리고 9개의 3×3 크기의 보드에 1부터 9까지의 숫자가 중복 없이 나타나도록 보드를 채우면 된다. 예를 들어 다
www.acmicpc.net
문제 해결
- 처음에 보면 까마득하다.(스도쿠 옛날에 풀어본 것 같은데 까먹기도 하고
실제로 싫어해서 싫어하는 문제..) - 하나씩 확인해가며 풀어야겠다는 것은 알겠는데 구현을 잘 못하였다. (시간초과)
- 다른 분의 풀이를 보면서 깔끔하게 푸는 방법을 배울 수 있었다.
- 값이 0인 좌표 (i,j)를 찾아서 1부터 9까지 넣을 수 있는 값을 대입해보고 다음 0값을 가진 좌표 (p,q)를 또 가져와 계속 대입해가며 가능한 해결방법을 찾는 문제.
- 순서를 1부터 9까지 0행부터 8행까지 순서대로 해야지 사전식으로 알맞은 문제 답을 추출할 수 있다.
- 모든 과정을 살펴보는 것을 백트래킹이라 한다고 한다. 더 많이 풀어봐야 할 것 같다.
CODE
def find_empty():
for i in range(9):
for j in range(9):
if board[i][j] ==0:
return i, j
return None, None
def valid(col, row, val): # (col,row) 위치 값이 val이 가능한지 문제 (행, 열, 박스 안에 val이 없으면 가능)
for i in range (9):
if board[col][i] == val: return False
if board[i][row] == val: return False
box_col = col//3
box_row = row//3
for i in range(3):
for j in range(3):
if board[box_col*3 + i][box_row*3 + j] == val:
return False
return True
def solution():
col, row = find_empty() # 비어있는 값의 위치 찾기
if col is None: # row가 None이여도 상관 없음(동치) 다 대입했다는 뜻
return True
else:
for i in range(1,10):
if valid(col, row, i):
board[col][row] = i
if solution():
return True
board[col][row] = 0
return False
if __name__=='__main__':
board = [list(map(int, input())) for _ in range(9)]
solution()
for i in range(9):
print(*board[i], sep='')
같은 유형
https://www.acmicpc.net/problem/2580
2580번: 스도쿠
스도쿠는 18세기 스위스 수학자가 만든 '라틴 사각형'이랑 퍼즐에서 유래한 것으로 현재 많은 인기를 누리고 있다. 이 게임은 아래 그림과 같이 가로, 세로 각각 9개씩 총 81개의 작은 칸으로 이루
www.acmicpc.net
728x90
반응형
'알고리즘 > [python] 백준 BOJ' 카테고리의 다른 글
[python] 백준 17142 연구소 3 (0) | 2023.04.12 |
---|---|
[python] 백준 2580 스도쿠 (0) | 2023.04.10 |
[python] 백준 12738 가장 긴 증가하는 부분 수열 3 (0) | 2023.04.09 |
[python] 백준 2141 우체국 (0) | 2023.04.09 |
[python] 백준 1238 파티 (0) | 2023.04.09 |
댓글