77.Combinations(재귀호출)

최기환·2023년 3월 1일
0

77. Combinations

[문제] Given two integers n and k, return all possible combinations of k numbers chosen from the range [1, n]. You may return the answer in any order.

재귀호출을 통해 해결했다.

/**
 * @param {number} n
 * @param {number} k
 * @return {number[][]}
 */
var combine = function(n, k) {
    let res = []; // 결과를 담을 빈 배열
    const backTrack = function(idx, arr, n, k) {
        if (arr.length == k) res.push([...arr]); // 깊은 복사를 통해 하지 않으면 arr의 값이 계속해서 변경되기 때문에 안된다. 배열의 길이가 k와 같아지면 res배열에 삽입한다.
        if (idx + 1 > n) return; // 만약 idx + 1이 n을 넘으면 범위를 벗어나므로 리턴한다. 
        for (let i = idx + 1; i <= n; i++) {
            arr.push(i); // arr에 i를 넣고  
            backTrack(i, arr, n, k); // 재귀호출 한 후
            arr.pop(); // i를 다시 꺼내 다음 조합을 탐색
        }
    }
    // 이후로는 i = 1에서부터 n 까지 넣고 빼며 재귀호출 하여 조합을 탐색
    let arr = []; 
    for (let i = 1; i <= n; i++) {
        arr.push(i);
        backTrack(i, arr, n, k);
        arr.pop();
    }
    return res; // 마지막으로 결과 반환
};

중급 문제였는데 왜 중급 문제인지는 모르겠다. 좀 쉬운 편이 아닌가 생각된다. 백준은 문제 등급이 섬세하게 나뉘어 있어 좋은데 reet코드는 같은 중급 문제여도 난이도가 천차만별인 것 같다. 그래도 reet코드는 solution을 찾기가 쉽고 추천을 많이 받은 솔루션을 보며 내 답과 비교해 볼 수 있어 좋기도 하고 기업별로 자주 출제된 문제들을 참고할 수 있어 좋다.

profile
프론트엔드 개발자를 꿈꾸는 취준생(백수) 입니다!

0개의 댓글