728x90
반응형
문제 출처:
12851번: 숨바꼭질 2
수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 �
www.acmicpc.net
아마도 이걸 보시는분들은 다들 문제를 보고오셧기 때문에 따로 문제설명은 안해도 될 것이라 생각합니다.
문제 풀이:
숨바꼭질 시리즈 중 하나고 전형적인 BFS 문제입니다.
다만 조금 까다로웠던 점은 최소 시간 뿐 아니라 갈 수 있는 방법의 수를 적어야 한다는 것이다.
처음에는 간단하게 생각했었는데 중복되어서 가는 방법의 수를 세는 것이 어려웠다.
from collections import deque
a,b = map(int,input().split())
def bfs(n,k):
#n: 시작 k: 도착
#output : time,cnt
if n==k:
return 0,1
if k<n:
return n-k,1
#visited[j] : j까지 오는데 최소의 시간 저장
#ways[j] : j까지 최소 시간으로 오는 방법의 수
visited = [1e12]*100001
stack = deque([n])
ways = [0]*100001
time=0
condition = False
ways[n]=1
visited[n]=0
while(stack and not condition):
size = len(stack)
for _ in range(size):
cur = stack.popleft()
next_move = [cur+1,cur-1,cur*2]
for j in next_move:
if(0<=j and j<=100000 and time+1<=visited[j]):
ways[j] +=1
visited[j] = time+1
if j==k:
condition=True
if not condition:
stack.append(j)
time +=1
return visited[k],ways[k]
t,cnt = bfs(a,b)
print(t)
print(cnt)
ps) 참고로 반례가 아주 잘 되어있는 문제라 공부하기가 좋은 문제였다.
반응형
'Computer Science > Algorithm' 카테고리의 다른 글
[백준] 20056 - 마법사 상어와 파이어볼(Python) (0) | 2020.10.29 |
---|---|
[백준] 20055 - 컨베이어 벨트 위의 로봇(Python) (0) | 2020.10.22 |
[프로그래머스] 가장 먼 노드(Level3) (Python) (0) | 2020.10.11 |
[프로그래머스] 순위(Level3) (Python) (0) | 2020.10.11 |
[백준] 17142 - 연구소3(Python) (0) | 2020.10.11 |