https://www.acmicpc.net/problem/1463
1463번: 1로 만들기
첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다.
www.acmicpc.net
N의 최댓값이 10^6이므로, 2부터 N까지 순서대로 이전값들을 참고하여 연산의 최솟값을 계산한다.
#include <cstdio>
#define MAX_N (int)1e6
#define INF 0x3f3f3f3f
// cnt[i]: i를 1로 만들기 위한 최소 연산 횟수
short cnt[MAX_N + 1];
short min(short a, short b) { return a < b ? a : b; }
int main() {
int N;
scanf("%d", &N);
// 2부터 N까지 차례대로
for (int i = 2; i <= N; i++)
// i - 1, i / 3, i / 2 중 연산 횟수가 가장 작은 값에 연산을 실행
cnt[i] = 1 + min(cnt[i - 1],
min(i % 3 ? INF : cnt[i / 3],
i % 2 ? INF : cnt[i / 2]));
// N을 1로 만드는 연산의 최소 횟수를 출력
printf("%d\n", cnt[N]);
return 0;
}
'알고리즘 > 문제 풀이' 카테고리의 다른 글
1476번: 날짜 계산 (0) | 2021.12.08 |
---|---|
1475번: 방 번호 (0) | 2021.12.08 |
1461번: 도서관 (0) | 2021.12.08 |
1436번: 영화감독 숌 (0) | 2021.12.08 |
1427번: 소트인사이드 (0) | 2021.12.08 |