전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하는 문제입니다. 접두어인 경우가 있으면 false를, 그렇지 않으면 true를 반환해야 합니다.
처음에는 단순히 HashSet에 번호를 넣으며 확인했지만, ["112", "11"]과 같이 긴 번호가 짧은 번호보다 먼저 등장할 경우 접두어를 찾아내지 못하는 문제가 있었습니다.
이를 해결하기 위해 Arrays.sort()를 사용했습니다. 문자열 정렬을 수행하면 길이가 짧거나 사전순으로 앞선 번호가 먼저 오기 때문에, 접두어가 뒤에 오는 경우를 방지할 수 있습니다.
각 전화번호를 한 글자씩 StringBuilder로 붙여가며, 현재까지 만들어진 부분 문자열이 HashSet에 존재하는지 확인합니다.
contains() 연산은 평균적으로 의 시간 복잡도를 가지므로, 전체 전화번호를 한 번만 순회()하면 문제를 해결할 수 있습니다.false를 반환하여 효율성을 높였습니다.import java.util.*;
class Solution {
public boolean solution(String[] phone_book) {
boolean answer = true;
Arrays.sort(phone_book);
Set<String> set = new HashSet<>();
for(String num : phone_book) {
StringBuilder st = new StringBuilder();
for(int i=0; i<num.length(); i++) {
st.append(num.charAt(i));
if(set.contains(st.toString())) {
System.out.println(st);
return false;
}
}
set.add(num);
}
return answer;
}
}
✅ 정렬의 마법
✅ 도구의 조합
✅ 트러블슈팅의 가치