문제 링크
분류 / 레벨 / 언어 동적계획법(Dynamic Programming) / LV.3 / Javscript
설명 N을 몇 번 썼는지를 메모이제이션 해둔다. 메모이제이션은 다음과 같다.https://ko.wikipedia.org/wiki/메모이제이션
메모이제이션을 사용하는 패턴은 대개 비슷하다. loop(i)에서 계산한 내용이 loop(i+1)로 넘어가면 증발하므로, 증발하기 전에 loop(i) 단에서 계산 결과만 전역 변수에 따로 저장하는 방식이다.
단, 이번 문제에서는 loop의 수가 8까지로 정해져있고, 각 메모이제이션마다 계산으로는 도달하는 것이 아닌 초기요소들 N, NN, NNN, NNNN, … 이 있으므로 이를 초반에 정적으로 정의한다.
전체 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 function solution (N, number ) { if (N === number) return 1 ; const memo = [0 , 1 , 11 , 111 , 1111 , 11111 , 111111 , 1111111 , 11111111 ].map ( v => new Set ([v * N]) ); const check = (x, y, i ) => { const isNumber = cal => { if (cal === number) return true ; else memo[i].add (cal); }; if ( isNumber (x + y) || isNumber (x * y) || isNumber (x - y) || isNumber (y - x) || (x !== 0 && isNumber (parseInt (y / x))) || (y !== 0 && isNumber (parseInt (x / y))) ) return true ; }; let nUsing = 2 ; while (nUsing < 9 ) { if (memo[nUsing].has (number)) return nUsing; for (let a = 1 ; a <= nUsing / 2 ; a++) { for (let x of memo[a]) { for (let y of memo[nUsing - a]) { if (check (x, y, nUsing)) return nUsing; } } } nUsing++; } return -1 ; }