๋ฌธ์ ๋งํฌ
https://programmers.co.kr/learn/courses/30/lessons/42895
์ฝ๋ฉํ ์คํธ ์ฐ์ต - N์ผ๋ก ํํ
programmers.co.kr
์ซ์ N์ผ๋ก ํน์ ํ ์ number์ ๋ง๋๋๋ฐ ํ์ํ N์ ์ต์ ๊ฐ์ ๋ฆฌํด
ํ์ด
๋จผ์ ์ฃผ์ด์ง ์์ ๋ฅผ ๋ณด์.
5๋ฅผ ์ด์ฉํด์ 12๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์๋ 3๊ฐ์ง๊ฐ ์๋ค.
12 = 5 + 5 + (5 / 5) + (5 / 5)
12 = 55 / 5 + 5 / 5
12 = (55 + 5) / 5
์ฒซ๋ฒ์งธ, ๋๋ฒ์งธ, ์ธ๋ฒ์งธ ๋ฐฉ๋ฒ์ ๊ฐ๊ฐ 5๋ฅผ 6๋ฒ, 5๋ฒ, 4๋ฒ ์ด์ฉํด์ ๋ง๋ค์๋ค.
์ฐ๋ฆฌ๊ฐ 5๋ฅผ ์ด์ฉํด์ ์ซ์๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ 5๊ฐ์ง๊ฐ ์๋ค.
1. 5๋ฅผ ์ด์ด๋ถ์ธ๋ค. ex) 55, 555, 5555, ...
2. +์ฐ์ฐ ์ฌ์ฉ. ex) 5 + 5, 55 + 5, ...
3. - ์ฐ์ฐ ์ฌ์ฉ. ex) 5 - 5, 55 - 5, ...
4. * ์ฐ์ฐ ์ฌ์ฉ. ex) 5 * 5, 55 * 55, ...
5. / ์ฐ์ฐ ์ฌ์ฉ. ex) 5 / 5, 55 / 5, ...
์ด๋ ๊ฒ ์ด์ด๋ถ์ด๊ธฐ์ 4๊ฐ์ง์ ์ฐ์ฐ์ ์ด์ฉํด์ ์ซ์๋ค์ ๋ง๋ค ์ ์๋ค.
- 1. ์ด์ด๋ถ์ด๊ธฐ ๋ฐฉ์
N์ 1๊ฐ ์ด์ด๋ถ์ด๋ฉด N, N์ 2๊ฐ ์ด์ด๋ถ์ด๋ฉด NN, N์ 3๊ฐ ์ด์ด๋ถ์ด๋ฉด NNN...
for(int i = 1; i<=8; i++){
int num = N;
for(int j = 1; j<i; j++){
num = num * 10 + N;
}
}โ
์์ ๊ณผ์ ์ ํตํด N์ i๋ฒ ์ด์ด๋ถ์ธ ์๋ฅผ ๋ง๋ค ์ ์๋ค.
- 2,3,4,5 ์ฐ์ฐ ๋ฐฉ์
์๋ฅผ ๋ค์ด 5๋ฅผ 3๋ฒ์จ์ ์์์ ์ซ์๋ฅผ ๋ง๋ ๋ค๊ณ ํ ๋,
5๋ฅผ ํ ๋ฒ์จ์ ๋ง๋ ์์ 5๋ฅผ ๋ ๋ฒ ์จ์ ๋ง๋ ์๋ฅผ 4๊ฐ์ง ์ฐ์ฐ(+, -, *, / ) ์ ์ด์ฉํด์ 5๋ฅผ ์ธ ๋ฒ ์ฌ์ฉํ ์ซ์๋ค์ ๋ํ๋ผ ์ ์๋ค.
N์ ํ ๋ฒ ์ฌ์ฉํด ๋ง๋ ์์ ๋ ๋ฒ ์ฌ์ฉํด ๋ง๋ ์๋ฅผ ์ด์ฉํด์ ์ธ ๋ฒ ์ฌ์ฉํด ๋ง๋ ์๋ค์ ๋ง๋ ๋ค.
=> Bottom - Up ๋ฐฉ์
๋ฐ๋ผ์ ์์์ K์ ๋ํด N์ K๋ฒ ์ฌ์ฉํด ๋ง๋ค ์ ์๋ ์ซ์๋ค์ ์์๋ด๊ธฐ ์ํด์๋ 1๋ฒ ~ K-1๋ฒ ์ฌ์ฉํด ๋ง๋ ์ซ์๋ค์ ๋ชจ๋ ์๊ณ ์์ด์ผํ๋ค. ๋ฐ๋ผ์ DP๋ฒกํฐ์ ์ซ์๋ค์ ์ ์ฅํด๋๋ค.
์ด๋ DP[ i ] ์ ๋ค์ด์๋ ์ซ์๋ค์ N์ i๋ฒ ์ฌ์ฉํด์ ๋ง๋ ๋ชจ๋ ์ซ์๋ค์ ์๋ฏธํ๋ค.
DP[i]์ ๋ค์ด์๋ ๊ฐ๋ค์ ์ค๋ณต์ด ์๋ฏธ๊ฐ ์์ผ๋ฏ๋ก ์ค๋ณต์ ์ ๊ฑฐํ๊ธฐ ์ํด set์ ์ฌ์ฉํ๋ค.
์๋ฅผ ๋ค์ด N์ K๋ฒ ์ฌ์ฉํด์ ์ซ์๋ฅผ ๋ง๋ค์ด ๋ณด์.
DP[1]์ ์๋ ์ซ์ ( +,-,*,/ ) DP[K-1]์ ์๋ ์ซ์, DP[2]์ ์๋ ์ซ์ ( +,-,*,/ ) DP[K-2]์ ์๋ ์ซ์, DP[3]์ ์๋ ์ซ์ ( +,-,*,/ ) DP[K-3]์ ์๋ ์ซ์, ... , DP[K-1]์ ์๋ ์ซ์ ( +,-,*,/ ) DP[1]์ ์๋ ์ซ์๋ฅผ ํ ๊ฒฐ๊ณผ๋ค์ ๋ชจ์๋์ ๊ฒ์ด DP[K]๊ฐ ๋๋ค.
์ด๋ DP[1]์ ์๋ ์ซ์๋ฅผ DP[K-1]์ ์๋ ์ซ์์ ์ฐ์ฐํ ๊ฒฐ๊ณผ์, DP[K-1]์ ์๋ ์ซ์๋ฅผ DP[1]์ ์๋ ์ซ์๋ฅผ ์ฐ์ฐํ ๊ฒฐ๊ณผ๋ ๊ฐ์ง ์๋๊ณ ์๊ฐํ ์๋ ์์ง๋ง, ๋ง์ฝ ์ฐ์ฐ ๊ณผ์ ์์ ์ฐ์ฐํด์ผํ ์ซ์์ ์๋ฆฌ๋ฅผ ๋ฐ๊พผ ๊ฒฝ์ฐ๋ ๋ชจ๋ ์๊ฐํด์ฃผ์๋ค๋ฉด ๊ฐ๋ค๊ณ ๋ด๋ ๋์ง๋ง ์๋๋ฉด ๋ ๊ฐ์ง ๊ฒฝ์ฐ๋ ๋ค๋ฅธ ๊ฒฝ์ฐ๋ค.
+, * ์ ๊ฒฝ์ฐ๋ ์๊ด์์ง๋ง /, - ๊ฒฝ์ฐ์๋ a - b, a / b ์ b - a, b / a ๋ ๊ฒฐ๊ณผ๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ด๋ค.
์ฝ๋ ์์ฑ
|
#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
#include <math.h>
#include <set>
using namespace std;
set<int> DP[10];
void init(int N){
for(int i = 1; i<=8; i++){
int num = N;
for(int j = 1; j<i; j++){
num = num * 10 + N;
}
DP[i].insert(num);
}
}
int solution(int N, int number) {
int answer = 1;
if(N == number)
return answer;
init(N);
for(int i = 2; i<=8; i++){
for(int j = 1; j < i; j++){
for(auto a : DP[j]){
for(auto b : DP[i-j]){
DP[i].insert(a + b);
if(a - b > 0)
DP[i].insert(a - b);
DP[i].insert(a * b);
if(a / b > 0)
DP[i].insert(a / b);
}
}
}
if(DP[i].find(number) != DP[i].end())
return i;
}
return -1;
}
|
cs |
'ํ๋ก๊ทธ๋๋จธ์ค > 3๋จ๊ณ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํ๋ก๊ทธ๋๋จธ์ค Lv3] : [1์ฐจ] ์ ํ๋ฒ์ค (0) | 2022.07.06 |
---|---|
[ํ๋ก๊ทธ๋๋จธ์ค Lv3] : [1์ฐจ] ์ถ์ ํธ๋ํฝ (0) | 2022.06.30 |
[ํ๋ก๊ทธ๋๋จธ์ค Lv3] : ์ฌ ์ฐ๊ฒฐํ๊ธฐ (0) | 2022.06.23 |
[ํ๋ก๊ทธ๋๋จธ์ค Lv3] : ์ ๊ตญ์ฌ์ฌ (0) | 2022.06.21 |
[ํ๋ก๊ทธ๋๋จธ์ค Lv3] : ์์ (0) | 2022.06.20 |