[백준] 1697번 숨바꼭질

HL·2021년 1월 22일
0

백준

목록 보기
42/104

문제 링크

문제 설명

  • n, k가 주어짐
  • +1, -1, *2로 n에서 k까지 도달하는 최소 연산 횟수 출력

풀이

  • n에서 시작해 BFS로 k까지 탐색
  • n, k의 범위가 0~100000이라 범위를 리스트 길이를 0~200000으로 초기화했다

느낀 점

  • 처음에는 DP를 생각해서 벨만-포드 느낌으로 풀어보려 했는데 시간 초과
  • 노드 별 거리가 1이라 BFS로 해야하는 것 같다

코드

from collections import deque

def bfs():
    visited = [False] * 200001
    visited[n] = True
    dist = [0] * 200001
    q = deque([n])
    while q:
        cn = q.popleft()
        if cn == k:
            return dist[cn]
        for i in range(3):
            nn = get_next_num(cn, i)
            if 0 <= nn < 200001:
                if not visited[nn]:
                    visited[nn] = True
                    q.append(nn)
                    dist[nn] = dist[cn] + 1


def get_next_num(num, i):
    if i==0:
        return num-1
    if i==1:
        return num+1
    return num * 2


n, k = map(int, input().split())
print(bfs())
profile
Swift, iOS 앱 개발을 공부하고 있습니다

0개의 댓글