[백준] 1525번 퍼즐 (python 파이썬)
by 코딩무비반응형
https://www.acmicpc.net/problem/1525
- 퍼즐 / 골드2 / 82분
생각해보아야 할 것
1. 어떤 수를 옮겨야 하는가?
- 0을 기준으로 상하좌우에 있는 수를 옮김
- 이 때, 바꾼 수와 기존의 수를 스와핑
nx ,ny = x+dx,y+dy
if 0<=nx<3 and 0<=ny <3 :
n_p = puzzles[:]
n_p = list(n_p)
n_p[3*nx+ny],n_p[3*x+y] = n_p[3*x+y] ,n_p[3*nx+ny]
2. 방문은 어떻게 구현해야 하는가?
- 해당 그래프를 문자열로 변환 뒤 딕셔너리에 추가
- 딕셔너리 키에 존재하지 않는 경우 큐에 추가
import sys
input = sys.stdin.readline
from collections import deque
def bfs():
while Q:
(x,y),puzzles,cnt = Q.popleft()
if puzzles == answer:
return cnt
for dx,dy in zip(X,Y):
nx ,ny = x+dx,y+dy
if 0<=nx<3 and 0<=ny <3 :
n_p = puzzles[:]
n_p = list(n_p)
n_p[3*nx+ny],n_p[3*x+y] = n_p[3*x+y] ,n_p[3*nx+ny]
str_l = ''.join(n_p)
if not visited_dict.get(str_l):
visited_dict[str_l] = 1
Q.append(((nx,ny),str_l,cnt+1))
return -1
G =""
for _ in range(3):
row = input().split()
row = ''.join(row)
G+=row
visited_dict = {}
Q = deque()
X = [0,0,-1,1]
Y = [-1,1,0,0]
answer = "123456780"
for i in range(9):
if G[i] == '0':
zero_idx = i
break
Q.append(((zero_idx//3,zero_idx%3),G,0))
print(bfs())
반응형
'문제풀이(ps)' 카테고리의 다른 글
[프로그래머스] 가장 먼 노드(python 파이썬) (8) | 2022.04.21 |
---|---|
[백준]16236번 아기 상어(python 파이썬) (4) | 2022.04.18 |
[백준] 11559번 Puyo Puyo(python 파이썬) (2) | 2022.04.14 |
[백준]14891번 톱니바퀴(python 파이썬) (7) | 2022.03.23 |
[백준]1939번 : 중량제한 (4) | 2022.03.19 |
블로그의 정보
코딩무비
코딩무비