전화번호부 문제(프로그래머스 42577)는 어떤 전화번호가 다른 번호의 접두사인지 확인하는 문제이다. 이번 글에서는 정렬과 해시를 활용한 효율적인 풀이법과 HashSet vs HashMap 선택 기준을 정리한다.
O(n log n)O(n*k) (k = 문자열 길이)O(n log n + n * k)// github 예시 코드: BOJ_42577_해시
Arrays.sort(phone_book);
for (int i = 0; i < phone_book.length - 1; i++) {
if (phone_book[i+1].startsWith(phone_book[i])) return false;
}
O(n * k)// github 예시 코드: BOJ_42577_Hash
HashSet<String> set = new HashSet<>(Arrays.asList(phone_book));
for (String number : phone_book) {
for (int i = 1; i < number.length(); i++) {
if (set.contains(number.substring(0, i))) return false;
}
}
결론: 존재 여부만 확인하면 HashSet, 값까지 관리해야 하면 HashMap
