알고리즘/Programmers
[프로그래머스/C++] N으로 표현
chaeD2
2022. 6. 20. 19:15
(6/20 - X)
https://programmers.co.kr/learn/courses/30/lessons/42895
코딩테스트 연습 - N으로 표현
programmers.co.kr
구현
1. N을 1개 사용하여 만든 집합을 N1, N을 2개 사용하여 만든 집합을 N2, N을 3개.. 박스에 넣는다고 생각하자. (중복되지 않는 원소를 갖는 unordered_set을 사용)
2. N1을 만들면서 컨테이너에 number와 값이 같은 수가 있는지 확인한다. 있으면 1을 return하는 식. 없다면 N2를 만들고, 또 없다면 N3을 만들고.. N7까지 만들어도 없다면 -1을 return한다.
1번을 구현하는 게 어렵다. 수 조합을 어떻게 만드냐 싶은데, 아래와 같이 그림을 그리면서 보면 패턴이 나온다.
코드
// [프로그래머스 코테 고득점 Kit] dynamic programming - n으로 표현
#include <string>
#include <vector>
#include <unordered_set>
#include <cmath>
using namespace std;
int make(int N, int p){//i=2일때 NN = N * 10 + N, i=3일때 NNN = N * 100 + N * 10 + N, i=4일때 NNNN..
int value = 0;
for (int i = 1; i <= p; i++) {
value += N * pow(10, i - 1);
}
return value;
}
int solution(int N, int number) {
int answer = 0;
if (N == number) return 1;
vector<unordered_set<int>> box(9);
box[1].insert(N); // N1에는 N 하나만
for (int i = 2; i < 9; i++) { //i3
box[i].insert(make(N, i));
for (int j = 1; j < i; j++) { //j=1,1<3,i-j==2 // j=2,2<3,i-j==1 //
for (auto& num_first : box[j]) {
for (auto& num_second : box[i - j]) {
box[i].insert(num_first + num_second);
box[i].insert(num_first - num_second);
box[i].insert(num_first * num_second);
if(num_second != 0)
box[i].insert(num_first / num_second);
box[i].insert(num_second + num_first);
box[i].insert(num_second - num_first);
box[i].insert(num_second * num_first);
if (num_first != 0)
box[i].insert(num_first / num_first);
}
}
}
if (box[i].end() != box[i].find(number)) {
answer = i;
return answer;
}
}
return -1;
}
int main() {
solution(5, 12);
}