티스토리 뷰

프로그래머스 (programmers) 코딩테스트 고득점 Kit 해시 #2 - 전화번호 목록


1. 문제 설명

문제: https://programmers.co.kr/learn/courses/30/lessons/42577

전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다.

전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다.


구조대 : 119

박준영 : 97 674 223

지영석 : 11 9552 4421

전화번호부에 적힌 전화번호를 담은 배열 phone_book 이 solution 함수의 매개변수로 주어질 때, 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 true를 return 하도록 solution 함수를 작성해주세요


2. 제한사항

phone_book의 길이는 1 이상 1,000,000 이하입니다.

각 전화번호의 길이는 1 이상 20 이하입니다.

3. 입출력 예


4. 입출력 예 설명

입출력 예 #1

앞에서 설명한 예와 같습니다.


입출력 예 #2

한 번호가 다른 번호의 접두사인 경우가 없으므로, 답은 true입니다.


입출력 예 #3

첫 번째 전화번호, “12”가 두 번째 전화번호 “123”의 접두사입니다. 따라서 답은 false입니다.



5. 나의 풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import java.util.Arrays;
class Solution {
    public boolean solution(String[] phone_book) {
        Arrays.sort(phone_book);
        for (int i = 0; i < phone_book.length-1; i++) {
            if (phone_book[i].length() < phone_book[i+1].length()) {
                if (phone_book[i].equals(phone_book[i+1].substring(0, phone_book[i].length()))) return false;
            } else {
                if (phone_book[i+1].equals(phone_book[i].substring(0, phone_book[i+1].length()))) return false;
            }
        }
        return true;
    }
}
 
cs


phone_book에는 String 형태의 자료가 들어있으므로 Arrays.sort를 하게되면 사전순으로 배열되어 맨앞자리부터 숫자가 적은 순서로 배열되어 바로 앞의 요소와만 비교를 진행하면 됩니다. 모든 요소의 i번째와 i+1번째 중 길이가 짧은 것이 긴것을 자른것과 같다면 false를 return시키는 방식으로 구현하였습니다.


6. 배운 점

다른 사람들의 풀이를 보니 startsWith() 함수를 사용한 것이 인상깊었습니다. String에 사용하여 앞에 문자열이 포함되는지에따라 true or false를 return하는 함수인데 저의 풀이에서 substring을 굳이 할 필요가 없어지니 앞으로 잘 활용해야겠습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import java.util.*;
class Solution {
    public boolean solution(String[] phone_book) {
        boolean answer = true;
        HashMap<String, Integer> map = new HashMap<String, Integer>();
        for(int inx = 0; inx < phone_book.length; inx++) {
            for(int jnx = 1; jnx < phone_book[inx].length(); jnx++) {
                map.put(phone_book[inx].substring(0, jnx), 1);
            }
        }
        for(int inx = 0; inx < phone_book.length; inx++) {
            if(map.containsKey(phone_book[inx])) {
                answer = false;
                break;
            } else {
                map.put(phone_book[inx], 1);
            }
        }
        return answer;
    }
}

cs


또한, Hash 단원이지만 Hash를 어떻게 활용해야할지 감이 안잡혔는데, 위의 풀이처럼 앞 요소부터 차례로 Map에 담고 containsKey를 활용하여 빠른 검색을 통해 true or false를 판단하는 방식으로 진행한 풀이가 있어 인상깊었습니다.

그러나 for문이 여러번 활용되어 복잡도가 높아질 수 있는 단점이 있습니다.


댓글