public static boolean solution(String[] phone_book) {
boolean answer = true;
Arrays.sort(phone_book);
int leng = phone_book[0].length();
for (int i = 1; i < phone_book.length; i++) {
if(leng >= phone_book[i].length()) {
leng = phone_book[i].length();
}
}
//System.out.println(leng);
HashMap<String, Integer> hm = new HashMap<>();
for (String ph : phone_book) {
hm.put(ph.substring(0, leng), hm.getOrDefault(ph.substring(0, leng), 0)+1);
}
for (String key : hm.keySet()) {
//System.out.println(key + " " + hm.get(key));
if(hm.get(key)>1) {
answer = false;
}
}
return answer;
}
테스트 케이스 딱 두개만 계속 실패가 뜬다.
도저히 반례를 알 수가 없어서 풀이를 좀 봤는데 다른 사람의 풀이는 해쉬맵을 이용하지 않고 배열을 오름차순으로 정렬 후 startsWith 함수로 체크했다.
boolean startsWith(String prefix)
특정 문자 또는 특정 문자열로 시작하는지 체크하는 함수
boolean endsWith(String suffix)
특정 문자 또는 특정 문자열로 끝나는지 체크하는 함수
난 일단 오름차순 정렬후 가장 짧은 번호의 길이를 체크했고 다른 번호들을 다 그 길이 기준으로 잘라서 해쉬맵에 넣어줬다. 중복되어 들어간 번호가 있으면 false를 반환하여 구분하려고 했는데 두 가지 케이스에서만 실패한다. 반례가 뭔지 알 수가 없어서 헤매는중 ..ㅠㅠㅠ
이건 참고할 때 봤던 다른 사람 소스
/*
boolean answer = true;
int p_cnt = phone_book.length;
Arrays.sort(phone_book);
for(int i=0; i<p_cnt-1; i++) {
if(phone_book[i+1].startsWith(phone_book[i])) {
answer = false;
break;
}
}
return answer;
*/