문제 접근방법은
- hashMap
- sort후 startsWith사용
이 있다.
바로 소개한다.
문제의 카테고리가 해시를 사용하는 것이기 때문에 단순히
1) hashmap에 키-값 쌍을 등록
2) 등록된 키 - 값 쌍중에 자기 자신을 제외한 substring 조합중에 hashmap에 등록된 키가 있는지 확인하는 작업이 필요했다.
특히 2)의 과정이 처음에 생각하기 복잡하고 막연했다. 이중 for-loop을 돌기도 하고 직접 고민을 하며 손코딩을 해야 했기 때문이다.
1) 키-값 쌍 등록
for(int i=0; i<phone_book.length;i++){
hashmap.put(phone_book[i],i);
}
여긴 이해하는데 여려울 것이 없다.
2) 등록된 hashmap에서 접두사 찾기
for(int i=0; i<phone_book.length;i++){
for(int j=0; j<phone_book[i].length();j++){
if(hashmap.containsKey(phone_book[i].substring(0,j)))
answer = false;
}
}
이 부분을 단순하게 설명하자면, 모든 phone_book String배열의 요소에 대해 각 요소에 substring을 사용하여 접근하여 hashmap에 등록된 키값이 있는지를 확인하는 과정이다.
이해가 되지 않는다면 손코딩을 강력 추천한다. 😥
주의할 점으로는, substring(0,end_index)는 0부터 end_index-1까지, 즉, 마지막 인덱스 전까지의 인덱스만 쪼개는 것으로 자기자신을 제외한 substring 조합을 탐색한다.
정리하자면
1. substring의 용도 파악
2. 각 배열 요소에 접근하는 for loop개념 파악
이 중요했다.
이 풀이는
1)sort를 생각해 낼줄 하느냐,
2)startsWith라는 메소드를 아느냐
가 핵심이다.
sort()메소드는 아스키코드에 등록된 사전순으로 객체를 나열한다.
오름차순으로 정렬하는 것이 포인트 이며, 만약 phone_book배열에 서로가 접두사 - 접두어가 되는 것이 있다면 즉, [예시1] 처럼 정렬된다.
119
11910
789
...
[예시 1]
그 다음 for loop를 통해 startsWith()메소드를 사용하여 뒤의 요소가 앞의 오름차순으로 정렬된 요소의 접두사인지 판별한다.
for(int i=0; i<phone_book.length-1;i++){
if(phone_book[i+1].startsWith(phone_book[i]))
answer = false;
}
주의할점은 phone_book[i+1], 즉, 뒤의 요소를 앞의 요소의 접두사인지 판단하므로 for - loop 탐색범위를 phone_book.length-1로 해주어야 한다는 것이다.
느낀점
자바가 지원하는 다양하고 유용한 메소드에 대해 학습하였으며,
특정상황에서 적재적소에 사용할 수 있도록 확실한 정리가 필요하여 이글을 쓴 나에게 뿌듯함을 느낀다.