ALGORITHM/PROGRAMMERS

[프로그래머스] 전화번호 목록

0298 2021. 8. 5. 14:12

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

 

코딩테스트 연습 - 전화번호 목록

전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다. 전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다. 구조

programmers.co.kr

2021-08-05


1. Trie

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import java.util.*;
class Solution {
    static class TrieNode {
        TrieNode[] next;
        boolean isLast;
        TrieNode() {
            next = new TrieNode[10];
            this.isLast = false;
        }
    }
    static class Trie {
        TrieNode root;
        Trie() {
            root = new TrieNode();
        }
        void insert(String word) {
            TrieNode node = root;
            for(int i = 0; i < word.length(); i++) {
                int w = Character.getNumericValue(word.charAt(i));
                if(node.next[w] == null) node.next[w] = new TrieNode();
                node = node.next[w];
            }
            node.isLast = true;
        }
        boolean contains(String word) {
            TrieNode node = root;
            for(int i = 0; i < word.length(); i++) {
                int w = Character.getNumericValue(word.charAt(i));
                if(node.next[w] == nullreturn false;
                node = node.next[w];
                if(node.isLast) return true;
            }
            if(node.isLast) return true;
            return false;
        }
    }
    static boolean solution(String[] phone_book) {
        boolean answer = true;
        Arrays.sort(phone_book);
        
        Trie t = new Trie();
        for(int i = 0; i < phone_book.length; i++) {
            if(!t.contains(phone_book[i])) t.insert(phone_book[i]);
            else {
                answer = false;
                break;
            }
        }
        return answer;
    }
}
cs

#문제풀이

Trie 자료구조 복습 겸 풀어봤다. 

 


 

2. startsWith

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

 

#문제풀이

사실 Trie까지 안 써도 된다. Arrays.sort로 비교 해놓고 앞에서부터 하나씩 startsWith로 바로 다음 값을 체크해주면 된다.