1. 문제 설명
전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다.
전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다.
- 구조대 : 119
- 박준영 : 97 674 223
- 지영석 : 11 9552 4421
전화번호부에 적힌 전화번호를 담은 배열 phone_book 이 solution 함수의 매개변수로 주어질 때, 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 true를 return 하도록 solution 함수를 작성해주세요.
2. 문제 풀이
(1) 정렬 후 String 클래스 Method를 이용한 풀이
import java.util.Arrays;
import java.util.Collections;
class Solution {
public boolean solution(String[] phone_book) {
boolean answer = true;
Arrays.sort(phone_book, Collections.reverseOrder());
for (int i = 0; i < phone_book.length-1; i++) {
if(phone_book[i].indexOf(phone_book[i+1]) == 0) {
answer = false;
}
}
return answer;
}
}
(i) 정렬
- 정렬을 이용하면 앞의 문자와 뒤의 문자의 비교만으로 문제를 풀 수 있다.
- 이중 Loof를 사용하지 않아도 된다.
- 오름차순으로 정렬시 phone_book[i]보다 phone_book[i+1] 문자열이 더 크므로 포함하지 않는다.
- ex) "12" "123456"
- 내림차순으로 정렬 해준다.
(ii) String Collection Method
- String Collection Method들 중 사용가능하겠다고 떠오른 처음 떠오른 Method는 String.contains()
- contains() method는 문자중에 포함만 된다면 true를 반환하기 때문에 접두사라는 조건을 만족하지 않는다.
- 13번 테스트케이스에서 실패가 뜬다.
- 다음 사용 Method는 String.indexOf()
- indexOf()는 특정 문자나 문자열이 앞에서부터 처음 발견되는 index를 반환한다. 찾지 못했을 경우 "-1" 반환
- 즉, index가 0이 return 되어야 접두사라는 조건을 만족한 것이다.
(2) HashMap을 사용한 풀이
import java.util.HashMap;
import java.util.Map;
class Solution {
public boolean solution(String[] phone_book) {
boolean answer = true;
Map<String, Integer> map = new HashMap<>();
for (int i = 0; i <phone_book.length; i++) {
map.put(phone_book[i], i);
}
for (int i = 0; i < phone_book.length; i++) {
for (int j = 1; j < phone_book[i].length(); j++) {
if(map.containsKey(phone_book[i].substring(0,j))) {
answer = false;
}
}
}
return answer;
}
}
(i) HashMap 사용
- phone_book 배열에 있는 문자열을 HashMap key로 넣는다.
- map.containKey()를 이용해서 순서대로 문자열 하나씩 비교한다.
반응형
'Algorithm' 카테고리의 다른 글
[Algorithm] 정렬 (Sort) (0) | 2022.01.22 |
---|---|
[BOJ] 15663번: N과 M (9) (JAVA) (0) | 2022.01.22 |
[Algorithm] 백트래킹 (Backtracking) (0) | 2022.01.21 |
[Algorithm] 완전탐색 (BruteForce) (0) | 2022.01.21 |
Greedy Algorithm (그리디 알고리즘) (0) | 2021.11.05 |
댓글