전화번호 목록
전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다. 전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다.
- 구조대 : 119
- 박준영 : 97 674 223
- 지영석 11 9552 4421
전화번호부에 적힌 전화번호를 담은 배열 phone_book 이 solution 함수의 매개변수로 주어질 때, 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 true를 return 하도록 solution 함수를 작성해주세요.
** 제한 사항 **
- phone_book의 길이는 1 이상 1,000,000 이하입니다. - 각 전화번호의 길이는 1 이상 20 이하입니다. - 같은 전화번호가 중복해서 들어있지 않습니다.
** 입출력 예제 **
phone_book | return |
---|---|
[“119”, “97674223”, “1195524421”] | false |
[“123”,”456”,”789”] | true |
[“12”,”123”,”1235”,”567”,”88”] | false |
** 입출력 예 설명 **
-
입출력 예 #1 - 앞에서 설명한 예와 같습니다.
-
입출력 예 #2 - 한 번호가 다른 번호의 접두사인 경우가 없으므로, 답은 true입니다.
-
입출력 예 #3 - 첫 번째 전화번호, “12”가 두 번째 전화번호 “123”의 접두사입니다. 따라서 답은 false입니다.
** 작성 코드 **
1
2
3
4
5
6
function solution(phone_book) {
let answer = phone_book.sort().some((el, idx, arr) => {
return arr[idx + 1]?.indexOf(el) === 0
});
return !answer;
}
** 코드 풀이 **
문제에서는 해시에 관한 문제라고 되어있지만 풀다보니 정렬을 이용한 방법이 더 빠른거 같아서 다른 방법으로 풀어보았다.
문제의 포인트는 ‘어떤 번호가 다른 번호의 접두어’가 되는 경우를 찾는 것인데 자바스크립트의 .sort() 특성 상 정렬을 하면 숫자의 크기 기준이 아닌 앞자리가 작은 수 기준으로 정렬이 된다.
1
2
3
4
5
//ex
let arr = ['1','2','3','11','22','33'];
console.log(arr.sort());
//result : ['1','11','2','22','3','33'];
그렇기 때문에 .sort()를 사용해서 문자열을 정렬한 후 .some()을 사용하였다. Array.some()은 각 요소 중 하나라도 true면 true를 리턴한다.
배열을 순회하면서 현재 요소와 다음 요소를 비교하며 접두어가 있으면 true를 반환하는데 문제에서는 접두어인 경우 false를 반환하라고 해서 반대로 리턴 해준다.
그리고 arr[idx + 1]?.indexOf(el) === 0 에서 ?.은 옵셔널체이닝으로 존재하지 않을 수 있는 프로퍼티나 메서드를 안전하게 호출 할 수 있도록 해주는데 idx가 마지막에 다다를경우 idx+1은 존재하지 않아서 에러가 발생하지만 옵셔널체이닝을 사용해서 에러 없이 코드를 실행 할 수 있다.
앞의 평가 대상이 undefined나 null이면 평가를 멈추고 undefined를 반환하기 때문이다.