개발개발자

1로 만들기 (1463번) 본문

알고리즘(Algorithm)

1로 만들기 (1463번)

맛두부 2017. 3. 5. 23:23

1. 문제


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

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

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


2. 포인트

1) 접근법 : 동적 계획법 (이전 저장값을 근간으로 향후 선택)
       * 풀이방법 : ① ↔ ② ↔ ③ 비교하여 최솟값 선택
            ①  A[x-1] +1 : 입력값(x)에 1뺀 해당 숫자 연산 횟수 + 1뺀 연산 
            ②  A[i/2] + 1 : 입력값(x)에 2로 나눈 해당 숫자 연산 횟수 + 2로 나눈 연산 
             A[i/3] + 1 : 입력값(x)에 3로 나눈 해당 숫자 연산 횟수 + 3로 나눈 연산 



2. 소스코드


#include <stdio.h>


#define LEN 1000000


int main(void)

{

int N=0;

int i;

int * Arr = (int*)malloc(sizeof(int)*LEN);


scanf("%d", &N);

Arr[1] = 0;


for (i = 2; i <= N; i++)

{

Arr[i] = Arr[i - 1] + 1;


if (i % 2 == 0 && Arr[i] > Arr[i / 2] + 1)

Arr[i] = Arr[i / 2] + 1;

if (i % 3 == 0 && Arr[i] > Arr[i / 3] + 1)

Arr[i] = Arr[i / 3] + 1;


}

printf("%d", Arr[N]);


free(Arr); // 메모리 해제 안해줘도 틀림

return 0;

}



'알고리즘(Algorithm)' 카테고리의 다른 글

시험 감독 (13458번)  (0) 2017.03.26
2xN 타일링 (11726번)  (0) 2017.03.06
피보나치 함수 (1003번)  (0) 2017.03.05
애너그램 만들기 (1919번)  (0) 2017.03.05
이친수 (2193번)  (0) 2017.03.05
Comments