#include <string>
#include <vector>
#include <cmath>
using namespace std;
int solution(int N, int number) {
vector<vector<int>> arr(8); //vector<int> 한 줄당 1개의 N을 씀. N을 쓸 수 있는 건 최대 8번
if (N == number)
return 1;
else
arr[0].push_back(N); //맨 첫번째 줄에 N을 집어넣음.
int i = 1; //N 2개 사용 부터 계산
while (i < 8)
{
int num = arr[i - 1][0] + N * pow(10, i); //arr[i][0]에는 N이 5라면, 5, 55, 555가 저장됨.
if (num == number)
return i + 1; //목표한 값이 맞다면 N사용한 횟수 반환
else
arr[i].push_back(num);
for (int k = 0; k < (i + 1) / 2; k++)
{
for (int l = 0; l < arr[i - 1 - k].size(); l++)
{
for (int j = 0; j < arr[k].size(); j++)
{
//덧셈과 뺄셈을 계산하여 정답이 아니면 저장한다.
if (arr[i - 1 - k][l] + arr[k][j] == number || arr[i - 1-k][l] - arr[k][j] == number)
return i + 1;
else
{
arr[i].push_back(arr[i - 1 - k][l] + arr[k][j]);
arr[i].push_back(arr[i - 1 - k][l] - arr[k][j]);
}
//곱셈이나 나눗셈 대상이 0이면, 연산의 의미가 없으므로 거른다.
if (arr[i - 1 - k][l] == 0 || arr[k][j] == 0)
continue;
else
{
//곱셈과 나눗셈을 계산하여 정답이 아니면 저장한다.
if (arr[i - 1 - k][l] * arr[k][j] == number)
return i + 1;
else
arr[i].push_back(arr[i - 1 - k][l] * arr[k][j]);
if (arr[i - 1 - k][l] % arr[k][j] == 0)
{
if (arr[i - 1 - k][l] / arr[k][j] == number)
return i + 1;
else
arr[i].push_back(arr[i - 1 - k][l] / arr[k][j]);
}
}
}
}
}
i++;
}
return -1;
}
풀고나서 다른 사람들의 풀이를 보니 재귀함수를 정의해서 푸시는 분들이 많았다.
내 방식은 N을 최소 5번 써야 답이 나온다면, N을 1번만 쓴 답과 4번만 쓴 답을 계산 시킨다.
또 2번만 쓰고 3번만 쓴 답을 계산시킨다. 예를 들면 N이 5이고 목표로 하는 값(number)가 126이라면 5*5*5 +5/5로 5를 5번 사용하는 게 최솟값이다.
N을 2번만 쓴 배열 arr[1] 내에 5/5값이 저장되어 있을 것이고, N을 3번만 쓴 배열 arr[2] 내에 5*5*5값이 저장되어 있을 것이다.
arr[1]과 arr[2]를 서로 계산시킴으로써 언젠간 126을 찾아내서, 5를 최소한으로 사용한 횟수가 5번이란 것을 밝혀낼 것이다.
N을 최소 4번 써야 된다면 N을 1번만 쓴 답과 3번만 쓴 답을 계산 시키고, N을 2번만 쓴 애들끼리 계산 시켜서 답이 나오게 된다.
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
[Level 2][C++] 영어 끝말잇기 (0) | 2024.10.01 |
---|---|
[Level 2][C++] 구명보트 (0) | 2024.10.01 |
[Level 1][C++] 체육복 (0) | 2024.10.01 |
[Level 1][C++] 모의고사 (0) | 2024.10.01 |
[Level 1][C++] 완주하지 못한 선수 (0) | 2024.10.01 |