Coding/알고리즘
[알고리즘 TIL] 전화번호 목록(Java, 해시)
kangplay
2025. 6. 5. 18:24
문제
https://school.programmers.co.kr/learn/courses/30/lessons/42577
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
프로그래머스 LV2
설명
전화번호부에 들어있는 전화번호의 수는 최대 1,000,000개이다. 따라서 만약 모든 전화번호와 대조한다면 1,000,000*1,000,000 의 최악의 시간이 걸리게 된다.
그렇다면 어떻게 시간복잡도를 효율적으로 구현할 수 있을까? 전화번호는 자릿수가 20이라는 제한이 있다. 따라서 각 전화번호마다 자릿수만큼 subString을 구해서 해당 subString이 다른 전화번호랑 일치하는지 확인한다. 이때, substring이 O(n), containsKey가 O(1) 이므로 O(400*N)으로 해결할 수 있다.
따라서 이 문제에서는 조회 성능이 뛰어난 해시(HashMap) 자료구조를 사용하는 것이 매우 적합하다.
구현
import java.util.*;
class Solution {
public boolean solution(String[] phoneBook) {
boolean answer = true;
HashMap<String, Integer> hashMap = new HashMap<>();
int index = 0;
for(String phoneNumber : phoneBook) {
hashMap.put(phoneNumber,index++);
}
for(String phoneNumber : phoneBook) {
for(int i=0;i<phoneNumber.length();i++){
String prefix = phoneNumber.substring(0, i);
if(hashMap.containsKey(prefix)) {
answer = false;
break;
}
}
}
return answer;
}
}