인프런 커뮤니티 질문&답변

jjang9님의 프로필 이미지
jjang9

작성한 질문수

자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)

15. 수들의 조합

질문드립니다.

작성

·

143

1

      function solution(n, k, arr, m) {
        let tmp = new Array(k).fill(0);
        let answer = [];
        function DFS(L, s, sum) {
          if (L === k && sum % m === 0) {  ////////// 이렇게 작성하면 
            console.log(tmp);
            answer.push(tmp.slice());
          } else {
            for (let i = s; i < n; i++) {
              tmp[L] = arr[i];
              DFS(L + 1, i + 1, sum + arr[i]);
            }
          }
        }

        DFS(0, 0, 0);
        return answer.length;
      }

      let arr = [2, 4, 5, 8, 12];
      console.log(solution(5, 3, arr, 6));

위 코드에서 if 부분을 제가작성한것처럼 하면 tmp를 출력했을 때 이러헥 12가 중복되서 나오게 되는데 이유를 잘 모르겠습니다. 

if ( L === k &&  sum % m === 0 ) 와

if( L ===k ) {

 if (sum % m ===0)

 {   ~~}

}

은 다른가요??

답변 1

2

김태원님의 프로필 이미지
김태원
지식공유자

안녕하세요^^

레벨의 나타내는 L값은 k보다 커지면 안됩니다. L값이 k가 됬을 때 n개중에서 k개를 뽑은 경우가 하나 완성된 것입니다. 즉 L은 k값 이하에서만 움직여야 합니다.

그런데 하나의 조합이 완성되는 조건을 if(L==k && sum%m==0)으로 하면 L==k가 되어 n개중 k개를 뽑았는데, sum%m==0을 만족하지 않아 재귀가 더 뻗어서 L이 k보다 커지게 됩니다. 

아래 코드를 실행해서 확인해 보세요.

function solution(n, k, arr, m) {
        let tmp = new Array(k).fill(0);
        let answer = [];
        function DFS(L, s, sum) {
          console.log(L, s, sum, tmp);
          if (L === k && sum % m === 0) {  ////////// 이렇게 작성하면 
            console.log(tmp);
            //answer.push(tmp.slice());
          } else {
            for (let i = s; i < n; i++) {
              tmp[L] = arr[i];
              DFS(L + 1, i + 1, sum + arr[i]);
            }
          }
        }

        DFS(0, 0, 0);
        return answer.length;
      }

      let arr = [1, 2, 3, 4, 5];
      console.log(solution(5, 3, arr, 12));
jjang9님의 프로필 이미지
jjang9
질문자

감사합니다~!

jjang9님의 프로필 이미지
jjang9

작성한 질문수

질문하기