이번에 풀어본 문제는
프로그래머스 전화번호 목록 입니다.
import java.util.*;
class Solution {
public boolean solution(String[] phone_book) {
boolean answer = true;
Set<String> set = new HashSet<>(Arrays.asList(phone_book));
loop: for (String phone: phone_book) {
int length = phone.length();
for (int i = 1; i < length; i++) {
if (set.contains(phone.substring(0, i))) {
answer = false;
break loop;
}
}
}
return answer;
}
}
전화번호 목록 phone_book이 주어집니다.
이 목록에서 각 전화번호가 다른 전화번호의 접두어가 가능한 경우가 존재하면 false, 아니면 true를 반환하는 문제입니다.
처음에는 이중 반복문을 통해 각 전화번호를 다른 전화번호와 비교하여 String.startsWith() 메서드가 참인 경우를 탐색했었는데, 효율성에서 통과하지 못했습니다.
그 이유를 보니 phone_book의 최대 길이가 1,000,000 이었기 때문에 n^2로 작성된 코드로는 통과할 수 없었습니다.
다시 차근차근 조건을 파악해보니까, phone_book의 최댓값은 크지만, 전화번호는 최대 20밖에 되지 않는다는 특징을 발견했고, phone_book을 탐색하지 말고, 각 전화번호들을 set에 담아두고 최대 길이 20밖에 되지 않는 전화번호를 경우의 수 별로 잘라서 contains 메서드를 통해 확인하면 보다 효율적인 방법일 것이라고 생각했습니다.
다행히 통과했네요... 간단한 문제라고 생각했지만 틀려서 당황했던 문제입니다ㅋㅋㅋ