알고리즘 풀이/백준

[백준][Java] 5052번 전화번호 목록 (문자열)

배게 2021. 9. 20. 20:36
728x90

또.. 기믹 알아야 되는 문제

 

완전탐색은 당연히 안되고

그냥 붙어 있는 두개의 문자들중 앞에 있는 문자가 뒤에 있는 문자의 접두어인지만 확인하면 된다.

(문자배열은 오름차순으로 sort된 상태에서)

만약에 1개라도 그런 경우가 존재한다면 반드시 false를 반환할 수 밖에 없음

접두어라는 것은 필연적으로 서로 붙어 있을 수밖에 없음.. 그 두개의 문자 사이에 무언가가 있을 수는 있음

근데 그것 또한 앞뒤가 접두어 관계여야함 반드시 그 사실을 알면 쉬움

 

 

 

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
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;
 
 
public class Main {
        
    private static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    private static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    
    
    
    public static void main(String[] args) throws IOException{
        int T = stoi(br.readLine());
        
        Loop1:
        for(int i=0; i<T; i++) {
            int n = stoi(br.readLine());
            String[] arr = new String[n];
            for(int j=0; j<n; j++) {
                arr[j] = br.readLine();
            }
            Arrays.sort(arr);
            for(int j=0; j<n-1; j++) {
                if(arr[j+1].startsWith(arr[j])) {
                    System.out.println("NO");
                    continue Loop1;
                }
            }
            System.out.println("YES");
        }
                
        
        
//        bw.write("");
//        bw.flush();
//        bw.close();
        
            
        
    }
    
    private static int stoi(String input) {
        return Integer.parseInt(input);
    }
    
}
cs