알고리즘

백준 5052 전화번호 목록 (JAVA)

박카스마시며코딩 2021. 12. 17. 17:06

https://www.acmicpc.net/problem/5052

 

5052번: 전화번호 목록

첫째 줄에 테스트 케이스의 개수 t가 주어진다. (1 ≤ t ≤ 50) 각 테스트 케이스의 첫째 줄에는 전화번호의 수 n이 주어진다. (1 ≤ n ≤ 10000) 다음 n개의 줄에는 목록에 포함되어 있는 전화번호가

www.acmicpc.net

 

저는 트라이를 통해서 해당 문제를 해결하였습니다.

트라이를 통해서 해당 문자열의 prefix가 처음 나왔는지 탐색하였습니다.

저는 들어오는 순서대로 prefix가 있는지 판단하는 건 줄 알고 정렬을 하지 않고 계속 트라이를 통해 확인하여 틀렸습니다. 이를 정렬하여 트라이에 넣어서 문제를 해결하였습니다.

 

 

package BOJ.Tree;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
import java.util.function.Function;

public class BOJ_5052 {
    private static class Tree{
        boolean end = false;
        Tree[] leaf = new Tree[10];

        public boolean insert(String str , int depth){
            if(this.end){
                return false;
            }
            if(str.length() == depth){
                this.end = true;
                return true;
            }
            int now = str.charAt(depth) - '0';
            if(leaf[now] == null){
                leaf[now] = new Tree();
            }
            return leaf[now].insert(str,depth+1);
        }
    }
    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine()," ");
        Function<String,Integer> stoi = Integer::parseInt;
        int test = stoi.apply(st.nextToken());
        for(int t = 0 ; t < test ; t++){
            Tree tree = new Tree();
            boolean flag = true;
            st = new StringTokenizer(br.readLine()," ");
            int n = stoi.apply(st.nextToken());
            String[] input = new String[n];
            for(int i = 0 ; i < n ; i++){
                String now = br.readLine();
                input[i] = now;
            }
            Arrays.sort(input);
            for(int i = 0 ; i < n ; i++){
                if(flag && !tree.insert(input[i],0)){
                    flag = false;
                }
            }

            if(flag){
                System.out.println("YES");
            }else{
                System.out.println("NO");
            }
        }
    }
}

'알고리즘' 카테고리의 다른 글

백준 1436번 영화감독 숌(JAVA)  (0) 2021.12.19
백준 2470번 두 용액 (JAVA)  (0) 2021.12.18
백준 1931번 회의실 배정 (JAVA)  (0) 2021.12.16
백준 1309번 동물원 (JAVA)  (0) 2021.12.14
백준 1107번 리모컨 (JAVA)  (0) 2021.12.13