카테고리 없음
[알고리즘] 전화번호 목록 문제
코딩연습중
2026. 3. 12. 20:07
https://school.programmers.co.kr/learn/courses/30/lessons/42577
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
취준 중 오랜만에 여유가 생겨서 알고리즘 문제를 하나 풀어봤다!
전화번호부에 있는 번호들 중, 어떤 번호가 다른 번호의 접두어인지 확인하는 문제.
전화번호는 최대 1,000,000개.
길이는 각각 최대 20.
이중 for문으로 모든 번호를 다 비교하면 O(N²)인데,
최악의 경우 10^12번 비교해야 해서 말이 안 됨.
보통 1초에 10^8번 연산 가능하다고 잡으면 10,000초 수준이라 사실상 불가능.
따라서 이중 for문은 아님.
그럼 어떤 자료구조를 쓰면 좋을까?
처음에는 hash도 생각났는데,
이 문제는 단순 조회가 아니라 문자열끼리 접두어 비교가 필요해서
순서가 없는 map보다는 정렬 후 비교할 수 있는 list가 더 낫다고 판단.
일단 리스트로 바꾼 뒤 sort 해봄.
String 정렬 기준이 정확히 헷갈려서 직접 출력해봤는데,
사전순으로 잘 정렬되고 접두어 후보들도 서로 붙게 됨.
그러면 굳이 모든 문자열을 다 비교할 필요 없이
정렬된 상태에서 인접한 두 개만 비교하면 됨.
즉, curr와 next를 비교해서
next.startsWith(curr) 이면 curr가 next의 접두어라는 뜻이므로 false 반환.
import java.util.*;
class Solution {
public boolean solution(String[] phone_book) {
List<String> arrList = Arrays.asList(phone_book);
Collections.sort(arrList);
for(int i = 0; i < arrList.size() -1; i++){
String curr = arrList.get(i);
String next = arrList.get(i+1);
if(next.startsWith(curr)){
return false;
}
}
return true;
}
}