코딩테스트[파이썬]/알고리즘 문제풀이 입문

[BFS활용] - 송아지 찾기

softmoca__ 2024. 2. 11. 19:33
목차

송아지 찾기

 

현수는 송아지를 잃어버렸다. 다행히 송아지에는 위치추적기가 달려 있다.

현수의 위치와 송아 지의 위치가 직선상의 좌표 점으로 주어지면 현수는 현재 위치에서 송아지의 위치까지 다음과 같은 방법으로 이동한다.
현수는 스카이 콩콩을 타고 가는데 한 번의 점프로 앞으로 1, 뒤로 1, 앞으로 5를 이동할 수 있다.

최소 몇 번의 점프로 현수가 송아지의 위치까지 갈 수 있는지 구하는 프로그램을 작성 하세요.

 

입력설명
첫 번째 줄에 현수의 위치 S와 송아지의 위치 E가 주어진다. 직선의 좌표 점은 1부터 10,000 까지이다.

출력설명
점프의 최소횟수를 구한다.

 

입력예제 1

5 14

출력예제 1

3

 

 

나의 코드

from collections import deque
import sys

s,e=map(int,input().split())
dq=deque()
dq.append(s)
L=0

while dq:
    
    for i in range(len(dq)):
        x=dq.popleft()
        if x==e:
            print(L)
            sys.exit()
        
        dq.append(x-1)
        dq.append(x+1)
        dq.append(x+5)
    L+=1

print(L)

풀긴 풀었지만 while의 종료 조건로직이 떠오르지 않아 sys로 강제로 종료시켰다.

또한 불필요한 음수 값들에 대한 cut-edge를 하지 않아 매우 좋지 못한 코드인듯...

 

 

정답 코드

import sys
from collections import deque
sys.stdin=open("input.txt", "r")
MAX = 10000
ch = [0] * (MAX+1)
dis = [0] * (MAX+1)
n,m = map(int,input().split())
ch[n] = 1
dis[n] = 0
dQ = deque()
dQ.append(n)
while dQ:
    now = dQ.popleft()
    if now==m:
        break
    for next in (now-1, now+1, now+5):
        if 0 <= next <= MAX:
            if ch[next]==0:
                dQ.append(next)
                ch[next] = 1
                dis[next] = dis[now]+1
                
print(dis[m])

 

체크 배열을 사용하였다.

그 이유는 이미 큐에 들어갔다 나온(이미 탐색한) 좌표는 중복해서 탐색할 필요가 없기 때문이다.

또한 음수 좌표 또한 탐색할 필요가 없다 !