문제 설명
PROGRAMMERS-962 행성에 불시착한 우주비행사 머쓱이는 외계행성의 언어를 공부하려고 합니다. 알파벳이 담긴 배열 spell과 외계어 사전 dic이 매개변수로 주어집니다. spell에 담긴 알파벳을 한번씩만 모두 사용한 단어가 dic에 존재한다면 1, 존재하지 않는다면 2를 return하도록 solution 함수를 완성해주세요.
제한사항
- spell과 dic의 원소는 알파벳 소문자로만 이루어져있습니다.
- 2 ≤ spell의 크기 ≤ 10
- spell의 원소의 길이는 1입니다.
- 1 ≤ dic의 크기 ≤ 10
- 1 ≤ dic의 원소의 길이 ≤ 10
- spell의 원소를 모두 사용해 단어를 만들어야 합니다.
- spell의 원소를 모두 사용해 만들 수 있는 단어는 dic에 두 개 이상 존재하지 않습니다.
- dic과 spell 모두 중복된 원소를 갖지 않습니다.
풀이
const solution = (spell, dic) =>
dic
.map(word => [...word]
.filter((el, idx, arr) => spell.includes(el) && arr.indexOf(el) === idx)
.join(""))
.filter(word => word.length === spell.length)
.length !== 0 ? 1 : 2;
우선 dic의 모든 원소들에 대해서, 각 원소를 배열로 변경 하고, filter() 매서드를 이용해서 spell 배열 안에 각 글자가 포함되면서, indexOf() 매서드로 arr의 index가 첫번째 인덱스인지( 중복값 제거 )를 체크하고 다시 문자열로 합친 결과를 map()을 이용해서
배열로 만들었다.
그다음 해당 배열의 원소들중 길이가 spell의 길이와 같은것만을 filter()로 뽑아준 뒤,
그 배열의 길이가 0이 아니면 1, 0이라면 2를 리턴해주었다.
문제에 한번씩만 이라는 말이 있었는데 이걸 무시하고 통과되는 케이스가 많은듯..
나는 저렇게 무식하게 풀긴했는데 some 혹은 every를 알고 있으면 쉽게 풀 수 있는 문제인듯 하다.
그러니까,
const solution = (spell, dic) =>
dic.some(el => spell.every(el2 => el.includes(el2))) ? 1 : 2;
이렇게도 풀 수 있다.
음.. 확실히 맨날 쓰는것만 써서 문제를 풀려고 하니까 some과 every를 알고 있어도 안쓰게 되는듯..
다음부턴 조금 의식해서 풀어봐야겠다.
some은 주어진 조건에서 "하나라도" true일 경우 true를 리턴해주고,
every는 주어진 모든 조건이 만족할 경우 true를 리턴해준다.
즉, dic의 원소 중 spell의 모든 원소가 해당원소에 포함 된 경우가 하나라도 있다면, 1 아니면 2를 반환해준다.