민혁이의 IT스토리

[프로그래머스/JS] - 전화번호 목록 본문

알고리즘/코딩테스트

[프로그래머스/JS] - 전화번호 목록

FE_Minhyuk 2026. 4. 24. 13:24
문제 설명

전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다.전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다.
구조대 : 119
박준영 : 97 674 223
지영석 : 11 9552 4421
전화번호부에 적힌 전화번호를 담은 배열 phone_book 이 solution 함수의 매개변수로 주어질 때, 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 true를 return 하도록 solution 함수를 작성해주세요.


제한 사항

phone_book의 길이는 1 이상 1,000,000 이하입니다.
- 각 전화번호의 길이는 1 이상 20 이하입니다.
- 같은 전화번호가 중복해서 들어있지 않습니다.

 

출력 예

문제 요약

주어진 전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하는 문제입니다.

  • 접두어가 존재하는 경우: false 반환
  • 접두어가 없는 경우: true 반환

 

해결 방법: 정렬(Sorting) 후 인접 요소 비교

이 문제의 핵심은 모든 번호를 일일이 비교하는 $O(n^2)$ 방식이 아니라, 정렬을 통해 효율성을 높이는 것입니다.

  1. 문자열 정렬: phone_book을 정렬하면 사전순(Lexicographical Order)으로 나열됩니다. 이때, 특정 번호의 접두어가 될 수 있는 번호는 반드시 그 번호의 바로 앞에 위치하게 됩니다.
    • 예: ["12", "123", "88"] (정렬 후)
  2. 인접 요소 비교: 반복문을 통해 현재 요소(phone_book[i])가 다음 요소(phone_book[i+1])의 시작 부분과 일치하는지 startsWith() 메서드로 확인합니다.
  3. 효율성: 이 방식은 정렬에 O(n \log n), 비교에 O(n)이 소요되어 효율성 테스트를 가볍게 통과할 수 있습니다.

 

제출 코드

function solution(phone_book) {
    phone_book.sort();
    
    for (let i = 0; i < phone_book.length - 1; i++) {
        
        if (phone_book[i + 1].startsWith(phone_book[i])) {
            return false;
        }
    }
    return true;
}