-
[ DP ] 1로 만들기알고리즘/이코테 - 실전 2021. 8. 23. 18:19
난이도 : 중하 풀이시간 : 20분 시간제한 : 1초
[ DP ] 1로 만들기
정수 X가 주어질 때 정수 X에 사용할 수 있는 연산은 다음과 같이 4가지 이다.
- X가 5로 나누어 떨어지면 5로 나눈다.
- X가 3으로 나누어 떨어지면 3으로 나눈다.
- X가 2로 나누어 떨어지면 2로 나눈다.
- X에서 1을 뺀다.
정수가 주어졌을 때, 연산 4개를 적절히 사용해서 1을 만들려고 한다. 연산을 사용하는 횟수의 최솟값을 출력하시오
:: 입력 조건
- 첫째 줄에 정수 X가 주어진다.(1 <= X <= 30,000)
:: 출력 조건
- 첫째 줄에 연산을 하는 횟수의 최솟값을 출력한다.
아이디어
특정 수 x를 1로 만드는 개념이 아니라
2부터 시작해서 각수를 1로 만들 때 필요한 최소 횟수를 저장함
반복문의 수가 x가 되었을 때 반복을 멈추고 출력
내 코드
아이디어를 생각하지 못해서 답지 보고 클론 코딩함
#include <iostream> #include <vector> #include <algorithm> #include <string> using namespace std; #define endl "\n" int dp[30001]; int x; int main() { cin >> x; for (int i = 2; i <= x; i++) { // 1을 빼는 경우 dp[i] = dp[i - 1] + 1; // 2로 나뉘는 경우 if (i % 2 == 0) { dp[i] = min(dp[i], dp[i / 2] + 1); } // 3으로 나뉘는 경우 if (i % 3 == 0) { dp[i] = min(dp[i], dp[i / 3] + 1); } //5로 나뉘는 경우 if (i % 5 == 0) { dp[i] = min(dp[i], dp[i / 5] + 1); } } cout << dp[x] << endl; }
정답 코드
#include <bits/stdc++.h> using namespace std; // 앞서 계산된 결과를 저장하기 위한 DP 테이블 초기화 int d[30001]; int x; int main(void) { cin >> x; // 다이나믹 프로그래밍(Dynamic Programming) 진행(보텀업) for (int i = 2; i <= x; i++) { // 현재의 수에서 1을 빼는 경우 d[i] = d[i - 1] + 1; // 현재의 수가 2로 나누어 떨어지는 경우 if (i % 2 == 0) d[i] = min(d[i], d[i / 2] + 1); // 현재의 수가 3으로 나누어 떨어지는 경우 if (i % 3 == 0) d[i] = min(d[i], d[i / 3] + 1); // 현재의 수가 5로 나누어 떨어지는 경우 if (i % 5 == 0) d[i] = min(d[i], d[i / 5] + 1); } cout << d[x] << '\n'; }
'알고리즘 > 이코테 - 실전' 카테고리의 다른 글
[ DP ] 바닥 공사 (0) 2021.08.23 [ DP ] 개미전사 (0) 2021.08.23 [ 이진탐색 ] 떡볶이 떡 만들기 (0) 2021.08.10 [ 이진탐색 ] 부품 찾기 (0) 2021.08.10 [ 정렬 ] 두 배열의 원소 교체 (0) 2021.08.10