Algorithms/Algorithms

1로만들기 (백준1463)

탱젤 2021. 10. 13. 15:00

https://www.acmicpc.net/problem/1463

 

1463번: 1로 만들기

첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다.

www.acmicpc.net


Dnamic Programming(동적계획법)은 메모이제이션 통해 중복계산값을 저장해 효율을 높여준다.

1) Python 이용

# DP --> 메모이제이션: 중복계산값을 줄여 효율 높여줌

n = int(input())

d = [0] * (n + 1) 
# d에 계산값 저장
# d[0] = 0, d[1] = 0

for i in range(2, n + 1):
    d[i] = d[i - 1] + 1
    if i % 3 == 0:
        d[i] = min(d[i], d[i // 3] + 1)
    if i % 2 == 0:
        d[i] = min(d[i], d[i // 2] + 1)

print(d[n])

2) C 이용 (C 너무 오랜만이라 안까먹을려구,,,)

#include <stdio.h>
#include <stdlib.h>
#define min(x, y) ((x) < (y) ? (x) : (y))

int main()
{
    int n;
    scanf("%d", &n);
    int d[n + 1];
    d[0] = 0;
    d[1] = 0;
    for(int i = 2; i <= n + 1; i++)
    {
        d[i] = d[i - 1] + 1;
        if(i % 3 == 0) d[i] = min(d[i], d[(int)(i / 3)] + 1);
        if(i % 2 == 0) d[i] = min(d[i], d[(int)(i / 2)] + 1);
    }
    printf("%d", d[n]);
    
}

3) C++ 이용 (C++도 한번 배워보기,,,)

#include <iostream>
#include <algorithm>
using namespace std;

int d[10000001];

int main(){
    int n;
    
    cin >> n;

    for(int i = 2; i <= n; i++){
        d[i] = d[i - 1] + 1;
        if(i % 2 == 0) d[i] = min(d[i], d[i / 2] + 1);
        if(i % 3 == 0) d[i] = min(d[i], d[i / 3] + 1);
    }

    cout << d[n] << endl;

    return 0;
}
728x90