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 |
Tags
- 윤석열
- 왈왈왈
- 내란수괴 윤석열
- 파비우스 전략
- dfs
- BFS
- LCA
- Python
- 오블완
- 유니온 파인드
- 백준
- 비상계엄
- 재귀함수
- Prim
- union find
- 투 포인터
- 알고리즘
- 윤석열 내란수괴
- 구조론
- 이분 탐색
- 내란죄
- dfs 백트래킹
- 다익스트라
- 분할정복
- 프림
- 내란수괴
- 티스토리챌린지
- ccw
- DP
- 민주주의
Archives
- Today
- Total
Toolofv 님의 블로그
[Python] 백준 - 2580 스도쿠 본문
백준 - 2580 스도쿠
아홉 줄에 걸쳐 한 줄에 9개씩 게임 시작 전 스도쿠판 각 줄에 쓰여 있는 숫자가 한 칸씩 띄워서 차례로 주어진다. 스도쿠 판의 빈 칸의 경우에는 0이 주어진다. 스도쿠 판을 규칙대로 채울 수 없는 경우의 입력은 주어지지 않는다.
www.acmicpc.net
필요한 도구
1. 가로, 세로, 3x3 각 방문리스트
2. '0'이 있는 위치를 저장한 리스트 = zero
3. dfs 백트래킹 알고리즘
문제해결방법
1. 방문리스트를 가로, 세로, 3x3 공간에 없는 숫자를 체크할 수 있도록 이미 있는 숫자를 반영해둔다.
2. 위 3가지 리스트에 없는 숫자들을 빈자리에 채워넣으며, dfs가 호출된 횟수가 len(zero)와 같아지면 모두 채워졌다는 뜻이니, 출력한다.
- 코드
game = [list(map(int, input().split())) for _ in range(9)]
v_sero = [[0 for _ in range(10)] for _ in range(9)]
v_garo = [[0 for _ in range(10)] for _ in range(9)]
v_3x3 = [[0 for _ in range(10)] for _ in range(9)]
zero = []
for i in range(9):
for j in range(9):
if game[i][j] == 0:
zero.append((i, j))
else:
v_sero[j][game[i][j]] = 1
v_garo[i][game[i][j]] = 1
v_3x3[i//3*3+j//3][game[i][j]] = 1
def dfs(idx):
if idx == len(zero):
for i in range(9):
print(*game[i])
sys.exit()
return
x, y = zero[idx]
z = x//3*3+y//3
for i in range(1, 10):
if v_sero[y][i] == 0 and v_garo[x][i] == 0 and v_3x3[z][i] == 0:
v_sero[y][i] = 1
v_garo[x][i] = 1
v_3x3[z][i] = 1
game[x][y] = i
dfs(idx+1)
game[x][y] = 0
v_sero[y][i] = 0
v_garo[x][i] = 0
v_3x3[z][i] = 0
dfs(0)
반응형
'Algorithm' 카테고리의 다른 글
[Python] 백준 - 14889 스타트와 링크 (1) | 2024.09.27 |
---|---|
[Python] 백준 - 14888 연산자 끼워넣기 (1) | 2024.09.26 |
[Python] 프로그래머스 - 2020 KAKAO BLIND RECRUITMENT 문자열 압축 (0) | 2024.09.24 |
[Python] 백준 - 9663 N-Queen (1) | 2024.09.23 |
[Python] 백준 - 25682 체스판 다시 칠하기 2 (0) | 2024.09.20 |