본문 바로가기

Baekjoon(C++)

[C++]백준 알고리즘 1463번

풀이는 아래와 같다.

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
32
33
34
35
36
37
#include <iostream>
 
using namespace std;
 
 
int count[1000001];
void solve(int);
 
int min(int a, int b){
    return a>b? b:a;
}
 
int main(){
    int n;
    cin >> n;
    solve(n);
    
    cout << count[n] << '\n';
    return 0;
}
void solve(int n){
    for(int i=1; i<=n; i++){
        if(i == 1){
            count[i] = 0;
        }else if(i == 2 || i == 3){
            count[i] = 1;
        }else{
            count[i] = count[i-1]+1;
            if( i%3 == 0){
                count[i] = min(count[i/3]+1,count[i]);
            }if( i%2 == 0){
                count[i] = min(count[i/2]+1,count[i]);
            }
        }
    }
    return;
}
cs

시행착오:

처음에는 그냥 3으로 나누는게 가장 1로 빨리 가는 방법일 거라고 생각해서 전혀 자세히 생각하지 않고 알고리즘을 짰었는데, 그 다음으로는 2로 나누고, 그다음은 1을 빼는게 제일 줄어드는 폭이 작지 않을까 생각했었다. 근데 자세히 생각해보니 반례가 많은 것이다.

예를 들어 10을 한번 보자. 처음 생각한 방법대로라면 10->5->4->2->1 로 총 연산이 4번 진행된다. 하지만 실제로는 10->9->3->1의 방법으로 3번이 최소 횟수이다. 이런 사고 과정을 통해 알고리즘을 다르게 짜야됨을 깨달았다. 그래서 여기서 사용하기로 한 방법은 DP인데 Bottom up 방식과 Top down 방식 중에서 Bottom up 방식을 이용하기로 했다. 사실 알고리즘 초보라서 동적 프로그래밍도 잘 모르는데, 이런 간단한 문제들을 계기로 조금씩 더 익혀야겠다는 생각이 들었다!!! 그렇게 과제들을 C++로 하면서 알고리즘 자체에 대해서는 별로 생각을 안 했다니,, 얼마나 과제로 낸 코드들이 비효율적이었을까,, 암튼 더 열심히 해보자! 오랜만에 글을 올리는 거 같다 ㅎㅎㅎ 앞으로 또 꾸준히 오겠습니다^~^

 

이 글을 읽을 사람이 있을진 모르겠지만,

나는 현재 군인이고 여기서 할 수 있는 공부 중 하나인 알고리즘 공부를 기록으로 남기기 위해 이 티스토리를 작성하고 있다. 백준 문제에 대한 풀이와 시행착오를 기록할 예정이니 누군가에게 도움이 되면 좋겠다.

반응형

'Baekjoon(C++)' 카테고리의 다른 글

[C++]백준 알고리즘 10809번  (0) 2021.07.14
[C++]백준 알고리즘 19532번  (0) 2021.07.11
[C++]백준 알고리즘 2246번  (2) 2021.07.04
[C++]백준 알고리즘 10871번  (0) 2021.07.03
[C++]백준 알고리즘 2439번  (0) 2021.07.03