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