[JavaScript][Programmers] N으로 표현

조준형·2021년 7월 14일
0

Algorithm

목록 보기
30/142
post-thumbnail

🔎 N으로 표현

❓ 문제링크

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)
       }
     }
   }
 } 

얼추 어떤느낌인지는 알겠는데 정확하게는 모르겠어서 계속 다시봐야겠다.

profile
깃허브 : github.com/JuneHyung

0개의 댓글