[백준] 1463번 1로 만들기

반응형
반응형

문제

정수 X에 사용할 수 있는 연산은 다음과 같이 세 가지 이다.

  1. X가 3으로 나누어 떨어지면, 3으로 나눈다.
  2. X가 2로 나누어 떨어지면, 2로 나눈다.
  3. 1을 뺀다.

정수 N이 주어졌을 때, 위와 같은 연산 세 개를 적절히 사용해서 1을 만들려고 한다. 연산을 사용하는 횟수의 최솟값을 출력하시오.

입력

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

출력

첫째 줄에 연산을 하는 횟수의 최솟값을 출력한다.

 

이 문제는 재귀가 아니라 동적 프로그래밍으로 푸는 문제다.

동적이 뭔지 감이 잡히지 않았는데 알고 보니 점화식을 만들어서 그 값들을 배열에 넣고 사용하는 방식인 듯 싶다.

 

어쩌다 보니 정답이긴 한데...

조금 그렇다.

#include <bits/stdc++.h>
using namespace std;
int arr[2000050];
int main(void) {
 ios_base::sync_with_stdio(false);
	cin.tie(NULL);
  arr[0] = 0;
  arr[1] = 0;
  arr[2] = 1;
  arr[3] = 1;
  int num;
  cin >> num;
  for(int i = 4; i<=num; i++) {
     if (i % 3 == 0 && (arr[i-1] < arr[i/3])) {
       arr[i] = arr[i-1] + 1;
     } else if (i % 3 == 0 && arr[i-1] > arr[i/3]) {
       arr[i] = arr[i/3] + 1;
     } else if (i % 2 == 0 && (arr[i-1] < arr[i/2])) {
       arr[i] = arr[i-1] + 1;
     } else if (i % 2 == 0 && arr[i-1] > arr[i/2]) {
       arr[i] = arr[i/2] + 1;
     } else if (i % 3 == 0) {
       arr[i] = arr[i/3] + 1;
     } else if (i % 2 == 0) {
       arr[i] = arr[i/2]+1;
     } else {
       arr[i] = arr[i-1]+1;
     }
  }
    cout << arr[num] << "\n";
}

0과 1만 하면 되긴 하지만 원할함을 위해 2,3도 추가했다. 어차피 둘다 1이라 미리 추가해도 상관없을것 같다.

내 코드에서는 비교 하는 부분이 중요한데. 이 작업을 해주지 않으면 답이 틀린다.

예를 들면 10이랑 40을 들 수 있다.

10은 -> 9 -> 3 -> 1 로 총 3번이 된다.

일반적으로는 10 -> 5 -> 4 -> 2 -> 1로 총 4번이다. 이 두개를 비교해보면 월등이 1을 뺀게 더 작게 나온다.

하지만 40인 경우는 얘기가 다르다.

40 -> 20 -> 10 -> 9 -> 3 -> 1

40 -> 39 -> 13 -> 12 -> 4 -> 2 -> 1 이건 2로 나눈값이 더 작다. 이러한 점 때문에 비교 연산을 했다.

그런데, 2만 처리하면 끝날까? 아니다.3도 같은 방법으로 처리해줘야한다.

 

i%2 == 0을 한 이유는 정확함때문이다. 이걸 안해주면 예를들어, 7같은 경우는 답이 이상하게 나오기 때문이다.

 

 

#include <bits/stdc++.h>
using namespace std;
int d[1000005];
int n;
int main(void) {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cin >> n;
  d[1] = 0;
  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];
}

최솟값 비교라... ㅎㅎ 간단명료.

이렇게 해보자.

반응형

'알고리즘 > 백준' 카테고리의 다른 글

[백준] 2156번 포도주 시식  (0) 2020.04.15
[백준] 1181번 단어정렬  (0) 2020.04.15
[백준] 1021번 회전하는 큐  (0) 2020.04.12
[백준] 9012번 괄호  (0) 2020.04.11
[백준] 2552번 별 찍기 -12  (0) 2020.04.09

댓글

Designed by JB FACTORY