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
- 가여운 것들
- 디즈니플러스
- Pan's Labyrinth
- 페일맨
- 델 토르
- DP
- 스콧 조플린
- 블루스
- 범죄도시2
- 초창기 재즈
- 래그타임
- 조조래빗
- 백준 30958
- 1로 만들기
- 백준 12865
- 백준 2579
- 범죄도시
- 백준 10814
- Poor things
- jazz
- 가여운것들
- JOJO RABBIT
- 흑인 영가
- 라라랜드
- tlqkf
- CS231n
- 재즈
- 재즈의 탄생
- 요르고스 란티모스
- 백준
Archives
- Today
- Total
빙수의 팝콘
[백준] 1463번 1로 만들기 본문
문제
정수 X에 사용할 수 있는 연산은 다음과 같이 세 가지 이다.
- X가 3으로 나누어 떨어지면, 3으로 나눈다.
- X가 2로 나누어 떨어지면, 2로 나눈다.
- 1을 뺀다.
정수 N이 주어졌을 때, 위와 같은 연산 세 개를 적절히 사용해서 1을 만들려고 한다. 연산을 사용하는 횟수의 최솟값을 출력하시오.
입력
첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다.
출력
첫째 줄에 연산을 하는 횟수의 최솟값을 출력한다.
가장 쉬우면서도 대표적인 dp 문제이다.
2로 나눈 수, 3으로 나눈 수, 1을 뺀 수에 대한 최소 계산 횟수를 안다면, 각각의 수에 해당하는 최소 계산 횟수에서 1만 더해주면 연산을 시행하기 전 수에서의 최소 계산 횟수를 구할 수 있다. 한마디로 n이라는 수를 입력받았을 때 n까지 모든 수에 대한 최소 계산 횟수를 구해 list에 저장하면 된다.
코드는 아래와 같다. 더 간결하게 쓸 수 있을것 같아서, 추후 기회가 된다면 수정하고자 한다.
n = int(input())
count = [0] * (n+1)
for i in range(n):
if((i+1)%6 == 0):
count[i+1] = min(count[i], count[int((i+1)/2)], count[int((i+1)/3)])+1
else:
if((i+1)%2 ==0):
count[i+1] = min(count[i], count[int((i+1)/2)])+1
elif((i+1)%3 == 0):
count[i+1] = min(count[i], count[int((i+1)/3)])+1
else:
if(i!=0):count[i+1] = count[i] +1
print(count[n])
'빙수의 coding > 백준' 카테고리의 다른 글
[백준] 11053번 가장 긴 증가하는 부분 수열 (1) | 2023.12.21 |
---|---|
[백준] 12865번 평범한 배낭 (0) | 2023.12.21 |
[백준] 2579번 계단 오르기 (0) | 2023.12.20 |
[백준] 10814번 나이순 정렬 (1) | 2023.12.20 |
[백준] 30958번 서울사이버대학을 다니고 (0) | 2023.12.20 |