알고리즘/문제 풀이

1463번: 1로 만들기

Themion 2021. 12. 8. 12:44

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