

전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다.
전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다.
전화번호부에 적힌 전화번호를 담은 배열 phone_book 이 solution 함수의 매개변수로 주어질 때, 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 true를 return 하도록 solution 함수를 작성해주세요.

맨 처음 Map을 사용할 생각보다는 반복문을 통해서 접두어이니깐
어떤 전화번호가 다른 전화번호로 시작하는거니깐 startsWith 함수를 사용해서 풀면 되지 않을까? 생각했다. 그렇게 풀어서 테스트 코드도 통과하길래 음~ 맞는구나~ 하고 제출을 했는데
효율성 테스트에서 빵꾸가 나버렸다... 아마 해쉬를 안써서 그렇겠지 하고 다시 고민했다..

import java.util.*;
class Solution {
public boolean solution(String[] phone_book) {
boolean answer = true;
int n = phone_book.length;
Arrays.sort(phone_book);
for(int i = 0;i<n;i++){
for(int j = i+1;j<n;j++){
if(phone_book[j].startsWith(phone_book[i])) return false;
}
}
return answer;
}
}
그래서 생각하다가 잘 떠오르지 않아 다른 사람의 풀이를 참고했다..
나는 계속 작은길이의 전화번호를 긴전화번호에 대입해서 있는 경우를 생각했는데
map에 전화번호를 모두 넣어두고
반대로 긴 전화번호의 길이중 한글자씩 자르다가 map에 일치하는 값이 있다면 다른전화번호가 포함이 되었다는 거니깐 false를 리턴해주면 된다!
import java.util.*;
class Solution {
public boolean solution(String[] phone_book) {
boolean answer = true;
int len = phone_book.length;
Map<String,Integer> map = new HashMap<>();
for(int i = 0;i<len;i++){
map.put(phone_book[i],i);
}
for(int i = 0;i<len;i++){
for(int j = 0;j<phone_book[i].length();j++){
if(map.containsKey(phone_book[i].substring(0,j))) return false;
}
}
return answer;
}
}

map을 사용하면 훨~씬 빠르다는걸 알게 되었고 풀이가 안된다면 반대로 생각해보는 습관도 가져봐야겠다!