https://programmers.co.kr/learn/courses/30/lessons/42895
function solution(N, number) {
const s = [new Set()]
for (let i = 1; i <= 8; i++) {
s.push(new Set([new Array(i).fill(N).join('') * 1]))
for (let j = 1; j <= i; j++) {
for (const x1 of [...s[j]]) {
for (const x2 of [...s[i - j]]) {
s[i].add(x1 + x2)
s[i].add(x1 - x2)
s[i].add(x1 * x2)
if (x2) {
s[i].add((x1 / x2) - (x1 / x2) % 1)
}
}
}
} console.log(s);
if (s[i].has(number)) { return i }
}
return -1;
// console.log(s);
}
let N = 5;
let number = 12;
console.log(solution(N, number));
문제를 읽고 방법이 떠오르지 않아 다른사람의 코드를 참고했다.
문제에서 N을 8번까지만 사용하는것이 제한되어있다.
그래서 8번반복하여 s에 N으로 만들 수 있는 숫자를 저장해 둡니다.
s.push(new Set([new Array(i).fill(N).join('') * 1]))
1번 집합에는 5, 2번은 55외에 N+N, N-N, NN, N/N.
(즉, 1번요소로 사칙연산한 것이 들어갑니다.)
3번 집합은 555와 (1번요소 +/- 2번요소), (2번요소 +/- 1번요소)
4번 집합은 5555와 (1번요소 +/- 2번요소), (1번요소 +/-3번요소), (2번요소 +/- 3번요소)
....
만들어진 타겟인 number이 발견되면 바로 집합번호를 반환.
순회가 끝나도 number가없으면 -1리턴
처음에 설명을 보고, 코드를 봐도 이해가 잘 안됐다.
for (let j = 1; j <= i; j++) {
for (const x1 of [...s[j]]) {
for (const x2 of [...s[i - j]]) {
s[i].add(x1 + x2)
s[i].add(x1 - x2)
s[i].add(x1 * x2)
if (x2) {
s[i].add((x1 / x2) - (x1 / x2) % 1)
}
}
}
}
얼추 어떤느낌인지는 알겠는데 정확하게는 모르겠어서 계속 다시봐야겠다.