개발개발자
1로 만들기 (1463번) 본문
1. 문제
정수 X에 사용할 수 있는 연산은 다음과 같이 세 가지 이다.
- X가 3으로 나누어 떨어지면, 3으로 나눈다.
- X가 2로 나누어 떨어지면, 2로 나눈다.
- 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 |