자바스크립트 코딩테스트 '중복순열 구하기'

릿·2021년 9월 15일
0

코딩테스트

목록 보기
9/27

1부터 N까지 번호가 적힌 구슬이 있는데 중복을 허락하여 M번을 뽑아 일렬로 나열하시오.
첫번째 줄에 결과를 출력하고, 마지막에 총 경우의 수를 출력한다.

  1. 내 풀이 :
    그냥 재귀함수 써서 부분집합 개수가 2개인 것만 푸쉬해서 넣었더니 중복이 없... 부분집합 문제가 아닌 것 같다ㅠㅠ...
    쌤 강의 듣고 그러고보니 for문으로 풀면 될걸 왜때문에 재귀함수로 쓰고 있었나 싶어서
    for문으로 돌려봄. 매우 잘됨ㅋㅋㅋ 하지만 이건 재귀함수 문제라는 거;
function solution(n, m){
    let answer=[];
    let tmp="";
    for (let i=1; i<=n; i++) {
        for (let j=1; j<=n; j++) {
            tmp+=i;
            tmp+=j;
            answer.push(tmp);
            tmp="";
        }
    }
    answer.push(answer.length);
    return answer;
}
console.log(solution(3, 2));
  1. 쌤 풀이 :
    지금까지 배웠던건 2갈래로 뻗는 트리였는데, 이번문제는 3갈래로 뻗는 트리를 쓰는 거란다.
    for문은 이번처럼 2개 숫자만 리턴하면 된다면 그나마 양반, 3, 4, 5....늘어나면 계속 다중for문을 써야하기 때문에 비효율적이다.
    재귀함수문에 for문을 써서 n번 돌리는게 핵심!
    tmp변수에 slice를 쓴 이유는 얕은 복사가 되어서 자꾸 덮어쓰니까 같은 숫자만 나옴.
    새로 할당해줘야 값이 제대로 나온다.
function solution(n, m){
    let answer=[];
    let tmp=Array.from({length:m},()=>0);
    function DFS(L) {
        if(L===m){
            answer.push(tmp.slice());
        }
        else{
            for(let i=1; i<=n; i++) {
                tmp[L]=i;
                DFS(L+1);
            }
        }
    }
    DFS(0);
    return answer;
}
console.log(solution(3, 2))
profile
새로운 도전과 재미를 추구하는 프론트엔드 개발자

0개의 댓글