<실패했던 접근 방법 - 1>
1. 예제에서 10의 경우 2로 나누어떨어지지만, 10을 2로 나눠서 진행하는 것보다 10에서 1을 빼서 3으로 나누는 방법이 연산 횟수가 더 적다.
2. 2로 나누어떨어지더라도 1을 뺐을 때 3으로 나누어 떨어지면 그렇게 진행하는 것이 더 횟수가 적다고 판단
3. 메인 함수에서 조건문을 통해 다음과 같은 방식으로 알고리즘을 구현
<실패했던 알고리즘 - 1>
1. 조건문을 통해 2를 반복
2-1. 숫자가 3으로 나누어 떨어지면, 3으로 나누고 연산 횟수를 1 만큼 증가하고 2-5로 넘어간다. 그렇지 않으면 2-2로 넘어간다.
2-2. 숫자를 1 만큼 뺐을 때 3으로 나누어 떨어지면, 1을 빼고 3으로 나눈 후 연산 횟수를 2 만큼 증가하고 2-5로 넘어간다. 그렇지 않으면 2-3으로 넘어간다.
2-3. 숫자가 2로 나누어 떨어지면, 2로 나누고 연산 횟수를 1 만큼 증가하고 2-5로 넘어간다. 그렇지 않으면 2-2로 넘어간다.
2-4. 숫자를 1 만큼 빼고 연산 횟수를 1 만큼 증가한다. 2-5로 넘어간다.
2-5. 현재 숫자가 1이면 종료하고, 아니면 2-1부터 다시 반복 진행
<실패 이유>
주어지는 입력 값이 작을 경우는 잘 동작하지만 숫자가 커지면 되지 않는 경우가 발생
숫자가 커질 경우 위의 조건대로 하는 것보다 더 작은 경우가 있다는 것이기 때문에 어떠한 경우인지를 고민해봄
<실패했던 접근 방법 - 2>
1. 주어진 숫자로 1까지 만들어보는 연산을 다양하게 시도해본다.
2. 시도했던 방법들 중 연산 횟수가 가장 적은 것을 정답으로 출력한다.
<실패 이유>
사실 실패했다기보다는 구현을 하다가 중단했다. 입력 숫자가 1000000까지도 주어질 수 있는데 이 방법으로 프로그램을 짜면 좋지 않은 코드가 될 것 같았다.
<접근 방법>
1. 특정 수가 주어졌을 때, 연산을 1회 거친 다음의 최소 횟수는 해당 수가 주어졌을 때의 최소 연산 횟수를 구하는 것과 같다.
2. 1~10까지를 위의 방법으로 최소 횟수를 정리해보면 다음과 같다.
[1] - 0번
1. 1
[2] - 1번
1. 2 -> 1 (연산 2)
2. 2 -> 1 (연산 3)
[3] - 1번
1. 3 -> 1 (연산 1)
[4] - 2번
1. 4 -> 2 -> 1 (연산 2, 연산 2)
2. 4 -> 2 -> 1 (연산 2, 연산 3)
3. 4 -> 3 -> 1 (연산 3, 연산 1)
[5] - 3번
1. 5 -> [4] (연산 3, 2번)
[6] - 2번
1. 6 -> [3] (연산2, 1번)
2. 6 -> [2] (연산1, 1번)
[7] - 3번
1. 7 -> [6] (연산3, 2번)
[8] - 3번
1. 8 -> [4] (연산2, 2번)
[9] - 2번
1. 9 -> [3] (연산1, 1번)
[10] - 3번
1. 10 -> [9] (연산3, 2번)
3. 입력 숫자가 1~3인 경우는 미리 입력해준다.
4. 입력 숫자가 4 이상인 경우 4부터 주어진 입력 숫자까지 최소 연산 횟수를 구해나간다.
5. 특정 수의 최소 횟수를 구하기 위해서는 연산 1~3이 가능한지를 체크해보고 가능한 연산을 진행한 후, 가장 최소값을 최소 연산 횟수로 판단한다.
<위의 방법으로 성공한 코드는 다음과 같다>
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 38 39 | #include <iostream> using namespace std; int checkMinPath(int *cnt, int N) { int min = 1000000; int temp; if(N%3 == 0) { temp = cnt[N/3] + 1; min = temp; } if(N%2 == 0) { temp = cnt[N/2] + 1; if(temp < min) min = temp; } temp = cnt[N-1] + 1; if(temp < min) min = temp; return min; } int main(void) { int N, min, tempCnt; cin >> N; int cnt[N+1]; cnt[1] = 0; cnt[2] = 1; cnt[3] = 1; for(int i=4; i<=N; i++) { cnt[i] = checkMinPath(cnt, i); } cout << cnt[N] << "\n"; } | cs |
'C & C++ > Baekjoon' 카테고리의 다른 글
백준 2747 - 피보나치 수 (0) | 2019.01.13 |
---|---|
백준 10430 - 나머지 (0) | 2017.12.28 |
백준 10172 - 개 (0) | 2017.12.27 |
백준 9498 - 시험 성적 (0) | 2017.12.27 |
백준 8958 - OX퀴즈 (0) | 2017.12.27 |