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
- 운영체제
- 네트워크
- 코딩 테스트
- 킥스타트
- 파이썬
- 리눅스
- 백준
- 동적프로그래밍
- nlp
- dp
- 프로그래밍
- AI
- google coding competition
- 프로그래머스
- 구글 킥스타트
- 순열
- linux
- 딥러닝
- 동적 프로그래밍
- 브루트포스
- kick start
- 알고리즘
- PYTHON
- 코딩테스트
- 코딩
- DFS
- 그래프
- OS
- BFS
- CSS
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