Notice
Recent Posts
Recent Comments
Link
«   2026/06   »
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
Archives
Today
Total
관리 메뉴

dh-winternagi 님의 블로그

(1463) 1로 만들기 본문

백준 (C++)/Solve

(1463) 1로 만들기

dh-winternagi 2026. 4. 17. 20:50

https://www.acmicpc.net/problem/1463

단계별로 풀어보기

21단계(동적 계획법 1) 8번째

 

 

 

k에 대한 연산 최솟값을 dp[k]라고 하면 dp[k]는 dp[k-1], dp[k/3], dp[k/2] 중 최솟값에 1을 더한 값이다. (두번째, 세번째는 k가 3, 2로 나뉜다면)

다만 이렇게 탑-다운으로 풀면 재귀를 써야하므로 다운-탑으로 구현했다.

자명한 값인 dp[1]= 0을 제외한 값을 INF(문제의 답 범위를 상회하는 값)로 채운 뒤, 값이 구해진 dp[k]에 대해 dp[k+1], dp[3*k], dp[2*k]보다 dp[k]+1이 더 작다면 값을 갱신한다.

 

 

 

#include <iostream>
#include <vector>
using namespace std;

int main() 
{
  int n;
  
  cin >> n;
  
  vector<int> dp(n+1, 100001);
  
  dp[1]= 0;
  
  for(int i=1;i<n;i++){
    dp[i+1]= min(dp[i+1], dp[i]+1);
    if(3*i<=n)  dp[3*i]= min(dp[3*i], dp[i]+1);
    if(2*i<=n)  dp[2*i]= min(dp[2*i], dp[i]+1);
  }
  
  cout << dp[n];
  
  return 0;
}

'백준 (C++) > Solve' 카테고리의 다른 글

(2156) 포도주 시식  (0) 2026.04.17
(10844) 쉬운 계단 수  (0) 2026.04.17
(2579) 계단 오르기  (0) 2026.04.17
(1932) 정수 삼각형  (0) 2026.04.17
(1149) RGB거리  (0) 2026.04.17