300x250
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 네트워크
- 동적프로그래밍
- google coding competition
- 킥스타트
- 동적 프로그래밍
- DFS
- 프로그래밍
- 딥러닝
- 백준
- PYTHON
- BFS
- OS
- 구글 킥스타트
- 리눅스
- linux
- 알고리즘
- 순열
- nlp
- 파이썬
- 프로그래머스
- 브루트포스
- 그래프
- kick start
- 코딩 테스트
- 코딩테스트
- AI
- CSS
- dp
- 코딩
- 운영체제
Archives
- Today
- Total
오뚝이개발자
[백준 2239] 스토쿠 - 파이썬(Python) 본문
728x90
300x250
문제
https://www.acmicpc.net/problem/2239
나의 풀이
백트래킹을 사용해서 탐색을 해주면 된다. 검사할 항목은 가로, 세로, 3x3 사각형 안에 사용된 숫자들이 무엇인지이다. 이를 c1, c2, c3에 기록해두고 겹치지 않는 숫자 candidate들을 하나씩 넣어보면서 조건에 위배되는지를 살펴보고 위배된다면 백트래킹으로 다시 값들을 복구하고 다음 후보 숫자를 넣어 탐색하면 된다.
코드
# https://www.acmicpc.net/problem/2239
def cal(x,y):
return (x//3)*3 + (y//3)
def sol(n):
if n == 81:
for a in A:
print(''.join(list(map(str, a))))
return True
x = n // 9
y = n % 9
if A[x][y]:
return sol(n+1)
else:
for i in range(1,10):
if not c1[x][i] and not c2[y][i] and not c3[cal(x,y)][i]:
c1[x][i] = c2[y][i] = c3[cal(x,y)][i] = True
A[x][y] = i
if sol(n+1):
return True
c1[x][i] = c2[y][i] = c3[cal(x,y)][i] = False
A[x][y] = 0
return False
A = [list(map(int, input())) for _ in range(9)]
c1 = [[False]*10 for _ in range(9)] # row
c2 = [[False]*10 for _ in range(9)] # col
c3 = [[False]*10 for _ in range(9)] # 3x3 square
for i in range(9):
for j in range(9):
if A[i][j]:
c1[i][A[i][j]] = True # i행에 A[i][j] 숫자가 사용됨
c2[j][A[i][j]] = True # j열에 A[i][j] 숫자가 사용됨
c3[cal(i,j)][A[i][j]] = True # cal(i,j)번째 square에 A[i][j] 숫자가 사용됨
sol(0)
Reference : https://hazung.tistory.com/153
728x90
300x250
'코딩 테스트 > 백준' 카테고리의 다른 글
[백준 2143] 두 배열의 합 - 파이썬(Python) (0) | 2022.09.24 |
---|---|
[백준 2473] 세 용액 - 파이썬(Python) (0) | 2022.09.09 |
[백준 20040] 사이클 게임 (0) | 2022.08.17 |
[백준 12851] 숨바꼭질 2 (0) | 2022.04.16 |
[백준 2638] 치즈 (0) | 2022.04.16 |
Comments