개발/algorithm

[백준 5014번] 스타트링크 - python

zzi_on2 2022. 4. 8. 16:35

문제링크 

https://www.acmicpc.net/problem/5014

 

5014번: 스타트링크

첫째 줄에 F, S, G, U, D가 주어진다. (1 ≤ S, G ≤ F ≤ 1000000, 0 ≤ U, D ≤ 1000000) 건물은 1층부터 시작하고, 가장 높은 층은 F층이다.

www.acmicpc.net

풀이

- 간단한 bfs 문제 

- D 만큼 아래로 이동했을 때 방문하지 않았고 존재하는 층, 즉 0층보다 크면 이동할 수 있으므로 큐에 삽입, cnt + 1, 방문 표시 

  U만큼 위로 이동했을 때 방문하지 않았고 존재하는 층, 즉 F+1층보다 작으면 이동할 수 있으므로 큐에 삽입, cnt + 1, 방문 표시

  위 두 조건을 아무것도 만족시키지 않으면 이동할 수 없으므로 넘어감 

- G에 도착했으면 cnt 리턴, G에 이동하지 않았는데 더이상 이동할 수 없으면 -1 리턴 

from collections import deque 

def bfs(start):
    visited[start] = True 
    
    q = deque()
    q.append((start, 0))

    while q :
        x, cnt = q.popleft()
        
        # g에 도착했으면 
        if x == g :
            return cnt 
            
        # 아래로 이동할 수 있으면 
        if (x - d > 0 and not visited[x-d]) :
            q.append((x-d, cnt + 1 ))
            visited[x-d] = True
        # 위로 이동할 수 있으면 
        if (x + u < f + 1 and not visited[x+u]) :
            q.append((x+u,cnt+1))
            visited[x+u] = True
    
    return -1 
            
f, s, g, u, d = map(int,input().split())

visited = [False] *  (f + 1)
visited[s] = True
result = bfs(s)

if result == -1:
    print("use the stairs")
else:
    print(result)