Javascript - 외계어 사전

이율곡·2023년 7월 5일

Programmers

목록 보기
23/44
post-thumbnail

외계어 사전

문제

PROGRAMMERS-962 행성에 불시착한 우주비행사 머쓱이는 외계행성의 언어를 공부하려고 합니다. 알파벳이 담긴 배열 spell과 외계어 사전 dic이 매개변수로 주어집니다. spell에 담긴 알파벳을 한번씩만 모두 사용한 단어가 dic에 존재한다면 1, 존재하지 않는다면 2를 return하도록 solution 함수를 완성해주세요.

입출력 예

spelldicresult
["p", "o", "s"]["sod", "eocd", "qixm", "adio", "soo"]2
["z", "d", "x"]["def", "dww", "dzx", "loveaw"]1
["s", "o", "m", "d"]["moos", "dzx", "smm", "sunmmo", "som"]2

접근방법

이 문제의 핵심은 spell의 모든 원소를 조합해 만든 단어가 dic에 있느냐다. 그래서 이를 위한 접근 방법은 다음과 같다.

  1. spell 배열의 모든 원소를 조합하여 만들 수 있는 모든 단어를 생성
  2. 생성된 모든 단어를 확인하고, dic 배열에 존재하는지 확인
  3. 모든 가능한 단어를 확인한 후에도 dic 배열에 존재하는 단어를 찾지 못했다면 2를 반환

풀이

function permute(arr) {
    if (arr.length === 0) return [];
    if (arr.length === 1) return [arr.join('')];
    let results = [];
    
    for (let i = 0; i < arr.length; i++) {
        let currentChar = arr[i];
        let remainingChars = arr.slice(0, i).concat(arr.slice(i + 1));
        for (let perm of permute(remainingChars)) {
            results.push(currentChar + perm);
        }
    }
    return results;
}

function solution(spell, dic) {
    let permutations = permute(spell);
    
    for (let word of permutations) {
        if (dic.includes(word)) {
            return 1;
        }
    }
    return 2;
}

풀이는 재귀함수를 사용해서 풀었다. permute라는 함수를 만들었고 여기에 spell을 넣으면 모든 조합의 단어가 나온다. 그리고 반복문을 돌려 dic에 단어가 있으면 1을 반환 없으면 2를 반환한다.

재귀함수를 보면 이와 같다. 일단 재귀함수는 무조건 종료조건이 필요하다. 그래서 가장 처음의 두 if문, 배열이 0일 때와 1일 때 종료 조건에 해당한다.

다음으로 배열이 2이상일 때, 재귀함수가 작동한다. 우선 result라는 빈 배열을 생성하고, 반복문을 돌면서 spell 배열의 원소의 첫글자로 만들 수 있는 모든 단어를 만든다. currentChar는 첫 글자, remainingChars는 남은 원소들이다.

이를 반복문을 돌면서 모든 단어를 만들고 배열에 넣어 반환한다.


정리하기

이번에는 재귀함수를 사용해서 배열을 다루는 문제를 풀어봤다. 생각하는데 꽤나 골머리를 앓았지만, 풀고나서는 만족스러웠다. 다른 풀이들이 많이 존재하지만 가장 처음에는 문제를 이해하고 이를 잘 풀어보는게 중요한 것 같다.

profile
음악을 좋아하는 사람이 음악을 만들 듯, 개발을 좋아하게 될 사람이 쓰는 개발이야기

1개의 댓글

comment-user-thumbnail
2023년 7월 6일

나 이거 알지~~ ㅎㅎㅎ

답글 달기