๐ 1. ๋ฌธ์ ์ค๋ช
๐ก 2. ์ ๊ทผ๋ฐฉ์
๋์ ๊ณํ๋ฒ(Dynamic Programming)์ด๋?
๋์ ๊ณํ๋ฒ์ ์์ฃผ ์ฝ๊ฒ ์ค๋ช ํ์๋ฉด, '์ด๋ฏธ ๊ณ์ฐํ ๊ฑด ๊ธฐ์ตํด ๋์๋ค๊ฐ, ๋ค์ ํ์ง ๋ง์'๋ ์ ๋ต์ด๋ค.
๋์ ๊ณํ๋ฒ(Dynamic Programming, DP)์ ๋ณต์กํ ๋ฌธ์ ๋ฅผ ์์ ํ์ ๋ฌธ์ ๋ก ๋๋์ด ํด๊ฒฐํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ์ฌ ๋์ผํ ํ์ ๋ฌธ์ ๋ฅผ ๋ค์ ๊ณ์ฐํ์ง ์๋๋ก ํ๋ ์๊ณ ๋ฆฌ์ฆ ์ค๊ณ ๊ธฐ๋ฒ์ด๋ค. ์ฃผ๋ก ์ต์ ํ ๋ฌธ์ ๋ ์กฐํฉ ๋ฌธ์ ๋ฅผ ํจ์จ์ ์ผ๋ก ํด๊ฒฐํ ๋ ์ฌ์ฉ๋๋ค.
๋์ ๊ณํ๋ฒ์๋ Top-Down ๋ฐฉ์์ธ ๋ฉ๋ชจ์ด์ ์ด์ ๊ณผ Bottom-Up ๋ฐฉ์์ธ ํ ์ด๋ธ๋ง์ด ์๋ค.
Top-Down (๋ฉ๋ชจ์ด์ ์ด์ )
์ฌ๊ท๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐ.
ํ์ ๋ฌธ์ ์ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ์ฌ ์ค๋ณต ๊ณ์ฐ ๋ฐฉ์ง
Bottom-Up (ํ
์ด๋ธ๋ง)
์์ ๋ฌธ์ ๋ถํฐ ์ฐจ๋ก๋๋ก ํด๊ฒฐํ๋ฉฐ, ๊ฒฐ๊ณผ๋ฅผ ํ ์ด๋ธ์ ์ ์ฅ.
์ฌ๊ท๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋ฐ๋ณต๋ฌธ์ผ๋ก ๊ตฌํ
๋๋ฌด ์ด๋ ค์ด ๋ฌธ์ ๋ผ์ ์๋ฌด๋ฆฌ ๊ณ ๋ฏผํด๋ ํธ๋ ๋ฐฉ๋ฒ์ด ์๊ฐ๋์ง ์์
๋ค๋ฅธ ์ฌ๋ํ์ด๋ฅผ ๋ณด๋ n์ผ๋ก ๋ง๋ค์ ์๋ ์ต์ ์ซ์๋ฅผ ์ฐพ๋ ๋ฌธ์ ๊ฐ ์๋ X
"์ซ์๋ฅผ i ๊ฐ ์ฌ์ฉํ์๋ ๋ง๋ค์ด์ง๋ ๋ชจ๋ ์๋ค์ ํ๋์ ํต์ ๋ด๋๋ค"
๋ผ๋ ์ ์ ๋ก ๋ฌธ์ ์ ์ ๊ทผํด์ผ ํ๋ค.
๐ i๋ฒ์งธ ํต = ์ซ์ i๊ฐ๋ฅผ ์ฌ์ฉํ์๋ ๋์ค๋ ๋ชจ๋ ๊ฐ๋ค์ด ๋ค์ด๊ฐ๋ ํต(List<HashSet<Integer>>)
๐ ์ซ์ i๊ฐ๋ก ๋ง๋ค์ ์๋ ๊ฐ = number
1๋ฒ ํต์ ์ซ์ ํ๋๋ก ๋ง๋ค ์ ์๋ ์ = ์๊ธฐ ์์ ๋ฐ์ ๋ชป ๋ด๊ธฐ ๋๋ฌธ์ N
2๋ฒ ํต์๋ ์ซ์ 2๊ฐ๋ก ๋ง๋ค์ ์๋ ์ = 1๋ฒํต (์ฐ์ฐ์ +,-,*,/ ) 1๋ฒํต
โญ ์ฌ๊ธฐ์ ์ฃผ์ํ ์ ์ 3๋ฒ ํต๋ถํฐ์ด๋ค.
1๋ฒํต (์ฐ์ฐ์) 2๋ฒํต, 2๋ฒํต (์ฐ์ฐ์) 1๋ฒํต ์ฒ๋ผ
ํต์ ์์๊ฐ ์๋ค๋ก ๋ฐ๋๋ฉด ์๋ก ๋ค๋ฅธ ์ฌ์น์ฐ์ฐ์ด ๋๋ค.
์ฌ์น์ฐ์ฐ์ ๊ตํ ๋ฒ์น์ ๋ฐ๋ฅด์ง ์๊ธฐ ๋๋ฌธ์ (+, -, *, /์ ์์์ ๋ฐ๋ผ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง)
์๋ฅผ ๋ค์ด, 1 + 2์ 2 + 1์ ๊ฒฐ๊ณผ๊ฐ ๋์ผํ์ง๋ง, 1 - 2์ 2 - 1์ ๊ฒฐ๊ณผ๊ฐ ๋ค๋ฅด๋ค.
๋ฐ๋ผ์ 3๋ฒ ํต ์ดํ๋ก๋ ๊ฐ ํต์ ์๋ค ์์๋๋ก ๊ตฌ๋ถํ์ฌ ์ฐ์ฐ์ ํด์ผ ํ๋ค.
4๋ฒํต์ ๋ค์ด๊ฐ๋ ์
= ์ซ์ 4๊ฐ๋ฅผ ๊ฐ์ง๊ณ ๋ง๋ค ์ ์๋ ์
= 1๋ฒํต (์ฐ์ฐ์) 3๋ฒํต, 3๋ฒํต (์ฐ์ฐ์) 1๋ฒํต, 2๋ฒํต (์ฐ์ฐ์) 2๋ฒํต
...
์ด๋ ๊ฒ 8๋ฒ์งธ ํต๊น์ง ๋ง๋ค์ด ์ฃผ๋ฉด ๋๋ค.
8๋ฒ์งธ ํต๊น์ง๋ง ํ๋ ์ด์ ๋ ์ ํ์ฌํญ์ ์ต์๊ฐ์ด 8์ด ๋์ด๊ฐ๋ฉด -1์ ๋ฐํํ๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋ฆฌ๊ณ n=8์ผ๋ 5๋ฒ์งธํต์๋ ์ฌ์น์ฐ์ฐ์ ํตํด ๋์จ์๊ฐ ์๋ 88888 ์ด๋ผ๋ ์๋ ๋ฃ์ด์ค์ผ ํ๋ค.
Canva๋ก ์๊ฐํ ์์ผ๋ณด์๋ฉด ์๋์ ๊ฐ๋ค
์กธ๋ฉด์ ๊ทธ๋ ค์ ์ฐ์ฐ์ ์ ๋ ฌ ํ์ด์ง ๋ถ๋ถ์ ์ํด๋ถํ๋๋ฆฝ๋๋ค
[์์]
5๋ฅผ ์์๋ก ๋ค์ด๋ณด์.
5๋ฅผ 1๋ฒ ์ฌ์ฉ
5
5๋ฅผ 2๋ฒ ์ฌ์ฉ
55, (5 * 5), (5 / 5), (5 - 5), (5 + 5)
55, 25, 1, 0, 10
5๋ฅผ 3๋ฒ ์ฌ์ฉ
- 555, (55 * 5), (55 / 5), (55 - 5), (55 + 5)
- ((5 5) 5), ((5 5) / 5), ((5 5) + 5), ((5 * 5) -5)
- ((5 / 5) * 5), ((5 / 5) / 5), ((5 / 5) + 5), ((5 / 5) -5)
- ((5 + 5) * 5), ((5 + 5) / 5), ((5 + 5) + 5), ((5 + 5) -5)
- ((5 - 5) * 5), ((5 - 5) / 5), ((5 - 5) + 5), ((5 - 5) -5)
์ฝ๋ ํ๋ฆ
1. ์ซ์ N์ ๊ฐ์๋ณ๋ก ๋ง๋ค์ ์๋ ๋ฐ์ค๋ฅผ 1~8๊น์ง ๋ง๋ค๊ธฐ
2. ๋ฐ์ค ์ซ์๊ฐ n์ธ ๊ฒฝ์ฐ, ๋์นญ์ผ๋ก ๋ํด์ n์ด ๋๋ ๋ ์ซ์์ ๋ฐ์ค๊ฐ์ ๊ตฌํด์ ์ฑ์ฐ์ (ex. 5์ธ ๊ฒฝ์ฐ 1+5 2+3 3+2 5+1)
3. ๊ฐ ๋ฐ์ค๋ง๋ค ์ฐ์๋ ์ซ์๋ ๋ฃ์ด์ค๋ค (์ฐ์ฐ์ ์์ด ์ซ์๋ง์ผ๋ก ์ด๋ฃจ์ด์ง ์กฐํฉ)
4. ๊ฐ ๋ฐ์ค๋ง๋ค ์ค๋ณต๋ ๊ฐ์ด ๋ค์ด๊ฐ์ง ์๋๋ก ๋ฐ์ค๋ Set์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋ค.
โญ 3. ์ ๋ต์ฝ๋
์์ด๊ณ ๋จธ๋ฆฌ์ผ
2์๊ฐ์ด ๊ฑธ๋ฆฌ๋ค...
import java.util.HashSet;
import java.util.Set;
import java.util.ArrayList;
import java.util.List;
class Solution {
// ๋ ์งํฉ a์ b์ ์์๋ค์ ๋ํด ์ฌ์น์ฐ์ฐ ๊ฒฐ๊ณผ๋ฅผ union ์งํฉ์ ์ถ๊ฐํ๋ ํจ์
public void unionSet(Set<Integer> union, Set<Integer> a, Set<Integer> b) {
// ์งํฉ a์ b์ ๊ฐ ์์๋ค์ ๋ํด ์ฌ์น์ฐ์ฐ
// ๋๋์
์ ArithmeticException ๋ฐฉ์ง
for (int n1 : a) {
for (int n2 : b) {
union.add(n1 + n2); // ๋ง์
union.add(n1 - n2); // ๋บ์
union.add(n1 * n2); // ๊ณฑ์
if (n2 != 0) union.add(n1 / n2); // ๋๋์
}
}
}
// ์ฃผ์ด์ง N๊ณผ number๋ฅผ ์ฌ์ฉํด number๋ฅผ ๋ง๋ค ์ ์๋ ์ต์ ํ์๋ฅผ ๊ตฌํ๋ ํจ์
public int solution(int N, int number) {
// 9๊ฐ์ ์งํฉ์ ์ ์ฅํ ๋ฆฌ์คํธ ์์ฑ
// ๊ฐ ์งํฉ์ ํด๋น ํ์๋ก ๋ง๋ค ์ ์๋ ๊ฐ๋ค์ ์ ์ฅํ๋ ํต์ด๋ค.
List<Set<Integer>> setList = new ArrayList<>();
// ๊ฐ ์ธ๋ฑ์ค์ ํด๋นํ๋ ์งํฉ ๋ง๋ค๊ธฐ
for(int i = 0; i < 9; i++)
setList.add(new HashSet<>());
// ์ฒซ ๋ฒ์งธ ์งํฉ์ N์ ์ถ๊ฐ (1๋ฒ ์ฌ์ฉ์ผ๋ก N์ ๋ง๋ค ์ ์๊ธฐ๋๋ฌธ์)
setList.get(1).add(N);
// N์ด ๋ฐ๋ก number๋ผ๋ฉด 1๋ฒ์ผ๋ก ๋ง๋ค ์ ์์ผ๋ฏ๋ก ๋ฐ๋ก return 1
if (number == N) return 1;
// 2๋ฒ๋ถํฐ๋ 8๋ฒ๊น์ง ๋ฐ๋ณต๋ฌธ ๋๋ ค์ ๊ฐ๋ฅํ ๋ชจ๋ ์๋ฅผ ๊ณ์ฐ
for(int i = 2; i < 9; i++) {
// i๋ฒ์งธ ์งํฉ์ ๋ง๋ค๊ธฐ ์ํด, ์ด์ ์งํฉ๋ค ๊ฐ์ ์ฐ์ฐํ๊ธฐ
for(int j = 1; j <= i/2; j++) {
// ์งํฉ i๋ ์งํฉ j์ ์งํฉ (i-j)์ ์ฐ์ฐ ๊ฒฐ๊ณผ๋ฅผ ํฌํจ
unionSet(setList.get(i), setList.get(i-j), setList.get(j));
unionSet(setList.get(i), setList.get(j), setList.get(i-j));
}
// ์ฐ์ฐ ์์ด N๋ง i๋ฒ ๋ฐ๋ณตํด์ ๋ง๋ ์ ์ถ๊ฐ (์: N=5, i=4์ด๋ฉด 5555)
String n = Integer.toString(N);
setList.get(i).add(Integer.parseInt(n.repeat(i)));
// i๋ฒ์งธ ์งํฉ์ ์๋ ์ซ์๋ค ์ค์ number๊ฐ ์์ผ๋ฉด return i
for(int num : setList.get(i))
if (num == number) return i;
}
// 9๋ฒ๊น์ง ์๋ํด๋ number๋ฅผ ๋ง๋ค ์ ์๋ค๋ฉด -1 ๋ฐํ
return -1;
}
}
๐๐ป ์ข์์ ๊ฐ์ฅ ๋ง์ด ๋ฐ์ ์ฝ๋
import java.util.HashSet;
import java.util.Set;
class Solution {
public int solution(int N, int number) {
int answer = -1;
Set<Integer>[] setArr = new Set[9];
int t = N;
for(int i = 1; i < 9; i++) {
setArr[i] = new HashSet<>();
setArr[i].add(t);
t = t * 10 + N;
}
for(int i = 1; i < 9; i++) {
for(int j = 1; j < i; j++) {
for(Integer a : setArr[j]) {
for(Integer b : setArr[i - j]) {
setArr[i].add(a + b);
setArr[i].add(a - b);
setArr[i].add(b - a);
setArr[i].add(a * b);
if(b != 0) {
setArr[i].add(a / b);
}
if(a != 0) {
setArr[i].add(b / a);
}
}
}
}
}
for(int i = 1; i < 9; i++) {
if(setArr[i].contains(number)) {
answer = i;
break;
}
}
return answer;
}
}