[알고리즘] 송아지 찾기(BFS : 상태트리탐색)

(문제) 송아지 찾기(BFS : 상태트리탐색)


현수는 송아지를 잃어버렸다.

다행히 송아지에는 위치추적기가 달려 있다.

현수의 위치와 송아지의 위치가 직선상의 좌표 점으로 주어지면 현수는 현재 위치에서 송아지의 위치까지 다음과 같은 방법으로 이동한다.

현수는 스카이 콩콩을 타고 가는데 한 번의 점프로 앞으로 1, 뒤로 1, 앞으로 5를 이동할 수 있다.

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

입력설명

첫 번째 줄에 현수의 위치 S와 송아지의 위치 E가 주어진다.

직선의 좌표 점은 1부터 10,000 까지이다.

출력설명

점프의 최소횟수를 구한다.

테스트케이스

입력예제 출력예제
5 14 3
8 3 5
13 35 6
1 21 4
3 4356 873
7 8945 1790

동작 시각화












코드

from collections import deque

# 좌표의 MAX
MAX = 10000

# 각 좌표를 리스트로 생성
# 들어갈 수 있는 것의 값 -> 0 ~ MAX 까지
ch = [0] * (MAX + 1)
dis = [0] * (MAX + 1)

s, e = map(int, input().split())

# 처음 n에서 시작을 하니깐 n을 체크한다 (Level 1)
ch[s] = 1
# 거리는 0 출발 점이기 때문에
dis[s] = 0

# 큐를 생성
dQ = deque()
# 첫 root 노드 삽입
dQ.append(s)

while dQ:
    # 큐에서 하나를 꺼낸다
    now = dQ.popleft()
    # 넣은 큐 값에서 빼는 값이 m과 같을 경우 끝낸다!
    if now == e:
        break
    # 차례 차례 3 바퀴를 돈다 (튜플)
    # 자식으로 가지치기
    for next in (now-1, now+1, now+5):
        # next라는 값이 범위에 있고
        if 0 < next <= MAX:
            # 방문하지 않은 장소일 경우
            if not ch[next]:
                # 큐에 next라는 값을 대입
                dQ.append(next)
                # 방문을 했다는 것을 체크
                ch[next] = 1
                # 레벨을 가르키는 것이다!
                # 몇번을 돌았는지 (pop한 내용의 위치에 있는 dis + 1을 하여 Level을 올린다)
                dis[next] = dis[now] + 1

    # dis[m]에 저장되어있는 값을 통해서
    # 몇번 안에 갔는지 알 수 있다.
print(dis[e])

댓글남기기