🔔 답안만 쏙쏙 골라보고싶으신 분들께
풀이 과정과 접근 방법 없이, 문제에 대한 해설만 보고싶으시다면 접근2. 해시 | ContainsKey 로 가주시기 바랍니다.
전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다.
전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다.
전화번호부에 적힌 전화번호를 담은 배열 phone_book 이 solution 함수의 매개변수로 주어질 때, 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 true를 return 하도록 solution 함수를 작성해주세요.
String.startsWith()
메서드를 통해, 입력받은 모든 배열의 요소들을 다른 요소에 대한 접두어인지 확인한다.
이중for문을 통해, 배열 내에서 2개의 요소를 뽑는 모든 경우의수를 구한 뒤, 각 경우의수별로 startsWith 을 통해 검사한다.
public class Solution {
public boolean solution(String[] phone_book) {
for(int i = 0; i < phone_book.length-1; i++)
for(int j = i+1; j < phone_book.length; j++)
if(phone_book[i].startsWith(phone_book[j])
|| phone_book[j].startsWith(phone_book[i])) return false;
return true;
}
}
제출 후 채점하기
시, 효율성테스트 3번, 4번을 통과하지 못한다
원인 탐색
다음 추론을 바탕으로, 이중for 문을 사용하지 않는 새로운 로직을 고민하던중, HashMap 의 containsKey 의 시간복잡도가 O(1) 이라는 점을 통해 이중for문을 사용하더라도 최적화가 가능한 로직을 떠올리게 되었다
입력받은 배열 내의 모든 요소들을 HashMap
에 put
한다.
이후, 입력받은 배열 내의 요소들을 iteration 한다. 이때 각 요소들을 el
이라 한다.
el
을 이터레이션하여 마지막 인덱스부터 자른다 (예상되는 접두어를 구하기 위함)
이후, map.containsKey 를 통해 특정 요소가 el
의 접두어인지 확인한다
import java.util.HashMap;
import java.util.Map;
public class Solution {
public boolean solution(String[] phone_book) {
Map<String, Void> map = new HashMap<>();
for (String phone : phone_book) {
map.put(phone, null);
}
for (String phone : phone_book) {
for(int i = 1; i < phone.length(); i++) {
String sub = phone.substring(0, i);
if(map.containsKey(sub)) return false;
}
}
return true;
}
}
정확성 테스트 및 효율성 테스트를 전체 통과하였다