bong-u/til

프로그래머스 - 마법의 엘리베이터 (L2)

수정일 : 2023-07-24

첫번째 BFS 풀이

 1from collections import deque
 2
 3def solution(storey):
 4    answer = 0
 5    q = deque()
 6    q.append((storey, 0))
 7    visited = [False] * (10**8+1)
 8    
 9    while q:
10        cur, cnt = q.popleft()
11        
12        
13        visited[cur] = True
14        while cur != 0 and cur%10 == 0:
15            cur = cur // 10
16        if cur == 0:
17            answer = cnt
18            break
19        for j in [-1, 1]:
20            dest = cur + j
21            if 0 <= dest <= 10**8 and not visited[dest]:
22                q.append((dest, cnt+1))
23    
24    return answer

개선한 DFS 풀이

 1answer = 10**8
 2def dfs(cur, cnt):
 3    global answer
 4    if cur == 0:
 5        answer = min(answer, cnt)
 6        return
 7    while cur % 10 == 0:
 8        cur /= 10
 9
10    if cur%10 < 5:
11        dfs(cur//10, cnt+(cur%10))
12    elif cur%10 > 5:
13        dfs(cur//10+1, cnt+(10-cur%10))
14    else:
15        dfs(cur//10, cnt+(cur%10))
16        dfs(cur//10+1, cnt+(10-cur%10))
17
18def solution(storey):
19    dfs(storey, 0)
20    return answer

문제

  • 주인공 민수는 한번 엘레베이터를 타면 -1, +1, -10, +10 등 절댓값이 $10^c$ (c>=0인 정수) 만큼 이동 할 수 있다
  • 0층까지 갈려면 최소 몇 번 만에 이동할 수 있는지 구하라
  • 1 <= storey <= 100,000,000
  • TC
    • input

      16

    • ouput

      6

해결방법

  • 처음에는 bfs를 이용해서 +1, -1 한번씩하며 비효율적으로 해결하였다
  • 두번째 dfs풀이에서는 일의 자리에 따라 자릿수를 올리거나 내리고, 일의 자리를 한번에 계산하여 더 나은 풀이로 풀 수 있었다