Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 1차원 DP
- 2차원 dp
- 99클럽
- @GeneratedValue
- @GenericGenerator
- @Transactional
- Actions
- Amazon EFS
- amazon fsx
- Android Studio
- ANSI SQL
- ApplicationEvent
- async/await
- AVG
- AWS
- Azure
- bind
- builder
- button
- c++
- c++ builder
- c03
- Callback
- case when
- CCW
- chat GPT
- CICD
- Collections
- Combination
- combinations
Archives
- Today
- Total
기록
백준_12852_1로 만들기 2 본문
문제
풀이
N이 10이라고 할때, 경우의 수를 트리의 형태로 나열 할 수 있다. 같은 수가 다른 자리에서 여러번 등장할 수 있으므로 트리의 레벨 개념을 도입하였다. (N*level의 2차원 배열을 두었다고 생각할 수 있다.)
문제에서 N은 10^6보다 작은 자연수이므로, 메모리의 한계를 고려하여 defaultdict와 dict를 이용하여 아래의 코드처럼 표현하였다.
코드
from collections import defaultdict
N = int(input())
tree = defaultdict(dict) # child: {lv:p}
nums = [N]
lv = 0
# 1이 나올 때까지 트리 작성
while 1 not in nums :
lv = lv + 1
temp = list()
for n in nums :
if n%2==0 :
m = int(n/2)
tree[m][lv] = n
temp.append(m)
if n%3==0 :
m = int(n/3)
tree[m][lv] = n
temp.append(m)
if n>1 :
m = n-1
tree[m][lv] = n
temp.append(m)
nums = temp
# 경로 찾기
num = 1
ans = [str(num)]
print(lv)
while num!=N :
num = tree[num][lv]
ans.append(str(num))
lv-=1
print(" ".join(ans[::-1]))
'코딩테스트 > python' 카테고리의 다른 글
백준_1629_곱셈 (0) | 2021.01.05 |
---|---|
백준_9465_스티커 (0) | 2021.01.02 |
백준_2448_별 찍기 - 11 (0) | 2020.12.30 |
백준_17070_파이프 옮기기 1 (0) | 2020.12.30 |
백준_1085_직사각형에서 탈출 (0) | 2020.12.28 |
Comments