728x90
문제 설명
아래와 같이 5와 사칙연산만으로 12를 표현할 수 있습니다.
12 = 5 + 5 + (5 / 5) + (5 / 5)
12 = 55 / 5 + 5 / 5
12 = (55 + 5) / 5
5를 사용한 횟수는 각각 6,5,4 입니다. 그리고 이중 가장 작은 경우는 4입니다.
이처럼 숫자 N과 number가 주어질 때, N과 사칙연산만 사용해서 표현 할 수 있는 방법 중 N 사용횟수의 최솟값을 return 하도록 solution 함수를 작성하세요.
제한사항
- N은 1 이상 9 이하입니다.
- number는 1 이상 32,000 이하입니다.
- 수식에는 괄호와 사칙연산만 가능하며 나누기 연산에서 나머지는 무시합니다.
- 최솟값이 8보다 크면 -1을 return 합니다.
입출력 예
N | number | return |
5 | 12 | 4 |
2 | 11 | 3 |
첫 시도
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <unordered_set>
using namespace std;
int solution(int N, int number) {
vector<unordered_set<int>> dp;
dp.push_back(unordered_set<int>{N, N, N, N, N});
int count = 0;
bool whileBreak = true;
while (whileBreak)
{
dp.resize(dp.size() + 1);
unordered_set<int> chackSet;
for (auto& def : dp[count])
{
chackSet.insert(def + N);
chackSet.insert(def - N);
chackSet.insert(def * N);
chackSet.insert(def / N);
chackSet.insert(stoi(to_string(def) + to_string(N)));
if (chackSet.count(number) >= 1) {
whileBreak = false;
break;
}
}
count++;
if (count > 8)
return -1;
}
return count;
}
실패
내용물에 대한 괄호처리를 정상적으로 진행하지 못했다.
N, NN, NNN, NNNN에 대한 처리만 진행함.
아마 괄호가 처음꺼 두번째꺼 NN + N / N 이런식은 감지가 되는데, NN + (N/N) 은 처리할 수 없기 때문인거 같다.
두 번째 시도
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <unordered_map>
using namespace std;
int solution(int N, int number) {
if(N == number) return 1;
vector<unordered_map<int, string>> dp(9);
for (int i = 1; i <= 8; i++) {
string numString;
for (int j = 0; j < i; j++) {
numString += to_string(N);
}
dp[i].insert({ stoi(numString), numString });
}
for (int i = 2; i <= 8; i++) {
for (int j = 1; j < i; j++)
for (auto& def1 : dp[j])
for (auto& def2 : dp[i - j]) {
dp[i].insert(pair<int, string>(def1.first + def2.first, def1.second + "+" + def2.second));
dp[i].insert(pair<int, string>(def1.first - def2.first, def1.second + "-" + def2.second));
dp[i].insert(pair<int, string>(def1.first * def2.first, def1.second + "*" + def2.second));
if(def2.first != 0)
dp[i].insert(pair<int, string>(def1.first / def2.first, def1.second + "/" + def2.second));
}
if (dp[i].count(number) >= 1) {
std::cout << "Result : " << dp[i][number] << std::endl;
return i;
}
}
return -1;
}
성공
도대체 왜 시도가 성공하지 못하는가 생각했더니 괄호문제인것 같아서.
단순 무식하게 첫번째 배열값부터 마지막 배열값 까지의 괄호처리를 전부 진행해버렸다.
동작과정이 두번제곱승으로 더 많아진게 흠이다.
728x90
'코딩테스트 문제 풀이 > 동적계획법(Dynamic Programming)' 카테고리의 다른 글
점프와 순간이동 (0) | 2024.04.04 |
---|---|
2024 KAKAO WINTER INTERNSHIP 가장 많이 받은 선물 (0) | 2024.03.14 |
(2024 KAKAO WINTER INTERNSHIP) 주사위고르기 (1) | 2024.03.13 |
등굣길 (0) | 2024.02.06 |
정수 삼각형 (0) | 2024.01.26 |