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 |
Tags
- 1차원 DP
- 2차원 dp
- 99클럽
- @BeforeAll
- @BeforeEach
- @Builder
- @Entity
- @GeneratedValue
- @GenericGenerator
- @NoargsConstructor
- @Query
- @Table
- @Transactional
- Actions
- Amazon EFS
- amazon fsx
- Android Studio
- ANSI SQL
- api gateway 설계
- api gateway 필터
- ApplicationEvent
- assertThat
- async/await
- AVG
- AWS
- aws autoscaling
- aws eks
- AWS KMS
- aws 연동
- AWS 프리티어
Archives
- Today
- Total
기록
백준_12852_1로 만들기 2 본문
문제
12852번: 1로 만들기 2
첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 자연수 N이 주어진다.
www.acmicpc.net
풀이
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