1 minute read


전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다. 전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다.

  • 구조대 : 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를 반환하기 때문이다.