카테고리 없음

순열 dfs 재귀 동작 이해

sakuraop 2022. 12. 1. 18:14

https://www.youtube.com/watch?v=0tcgYHU8IIs 

 

순열 만들기 dfs 재귀 동작 이해


우선 a, b, c가 맨 앞에 있는 배열을 전달 

i=0, for (j=0) 
abc => abc
            [[arr[i]], arr[j]] = [[arr[j]], arr[i]];
abc 에 대해서 dfs 실행
            dfs(i + 1, arr);


i=0, for (j=1) 
abc => bac
            [[arr[i]], arr[j]] = [[arr[j]], arr[i]];
bac 에 대해서 dfs 실행
            dfs(i + 1, arr);

i=0, for (j=2) 
abc => cba
            [[arr[i]], arr[j]] = [[arr[j]], arr[i]];
cba 에 대해서 dfs 실행
            dfs(i + 1, arr);



그리고 나머지끼리 자리를 바꾼 뒤에 시행
a, bc,cb
b, ac, ca
c, ab, ba

i=1, for (j=1) 
abc => abc
            [[arr[i]], arr[j]] = [[arr[j]], arr[i]];
abc 에 대해서 dfs 실행
            dfs(i + 1, arr);

i=1, for (j=2) 
abc => acb
            [[arr[i]], arr[j]] = [[arr[j]], arr[i]];
acb 에 대해서 dfs 실행
            dfs(i + 1, arr);

i=1, for (j=1) 
bac => bac
            [[arr[i]], arr[j]] = [[arr[j]], arr[i]];
bac 에 대해서 dfs 실행
            dfs(i + 1, arr);

i=1, for (j=2) 
bac => bca
            [[arr[i]], arr[j]] = [[arr[j]], arr[i]];
bca 에 대해서 dfs 실행
            dfs(i + 1, arr);

i=1, for (j=1) 
cba => cba
            [[arr[i]], arr[j]] = [[arr[j]], arr[i]];
cba 에 대해서 dfs 실행
            dfs(i + 1, arr);

i=1, for (j=2) 
cba => cab
            [[arr[i]], arr[j]] = [[arr[j]], arr[i]];
cab 에 대해서 dfs 실행
            dfs(i + 1, arr);


i=3 이 되면 각각의 함수가 배열을 하나씩 반환(push)하게 됨
abc
acb
bac
bca
cba
cab

const permutation = (arr) => {
    const result = [];

    const dfs = (i, arr) => {
        if (i === arr.length) {
            return result.push([...arr]);
        }
        for (let j = i; j < arr.length; j++) {
            console.log(i, j, arr);
            [[arr[i]], arr[j]] = [[arr[j]], arr[i]];
            dfs(i + 1, arr);
            [[arr[i]], arr[j]] = [[arr[j]], arr[i]];
        }
    };
    dfs(0, arr);
    // console.log(result, "result");
    return result;
};
permutation(["a", "b", "c"]);