문제 풀이/Programmers 문제 풀이
[Programmers]#Level2_숫자 변환하기, DP
Hardii2
2024. 5. 17. 19:31
#1. 문제
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
#2. 풀이
1. DP
[알고리즘]#5_동적 계획법
[알고리즘]#5_동적 계획법 동적 계획 알고리즘에 대해 알아보겠습니다. Overview 개념 예제 #0. 개념 1. 동적 계획법(Dynamic Programming) 동적 계획법은 최적화 문제를 해결하는 데 사용되는 알고리즘 디
webddevys.tistory.com
동적 계획법은 주어진 입력 크기에 따라 하위 문제들을 재귀적으로 해결하고, 그 결과 값을 기억함으로써 중복 계산을 방지하는 최적화 기법입니다. 일반적으로, Top-Down 혹은 Bottom-Up 방식으로 점화식을 세워 코드를 작성합니다. DFS와 트리 자료구조에서 주로 활용됩니다.
2. Top-Down 방식의 점화식 세워 DP를 구현
- DFS를 활용할 경우, 시간 초과가 발생. 자연스럽게, DFS -> DP로 선회하여, y부터 x로 가는 Top-Down 방식의 점화식을 세워 DP를 구현합니다.
- y -> x 순서로 DP를 수행하며 총 3가지 경우에 대하여 경우의 수를 구하고, 이중 최소가 되는 값을 Memoization 합니다. 마지막으로, dp [x] 값이 업데이트되었다면, 그 값을 결과 값으로 반환합니다.
#3. 코드
/*
@문제 : 주어진 x를 3가지 방법(x*3, x*2, x+n)을 최소한으로 활용하여 Y를 만드는 연산 횟수
@설명
1. dfs 활용 시 시간 초과 발생
2. dp 활용, y부터 x까지 역순으로 DP수행하여 dp[x]를 반환
*/
#include <string>
#include <vector>
#include <algorithm>
#include <climits>
using namespace std;
#define MAX 1000001
int ans = INT_MAX;
vector<int> op = {2, 3};
vector<int> dp(MAX, INT_MAX);
int solution(int x, int y, int n)
{
dp[y] = 0;
for (int i = y; i > x; --i)
{
if (dp[i] != INT_MAX)
{
if (i % 3 == 0)
dp[i / 3] = min(dp[i / 3], dp[i] + 1);
if (i % 2 == 0)
dp[i / 2] = min(dp[i / 2], dp[i] + 1);
if (i - n > 0)
dp[i - n] = min(dp[i - n], dp[i] + 1);
}
}
if (dp[x] == INT_MAX)
return -1;
else
return dp[x];
}