본문 바로가기

Algorithm/문제풀이

백준 온라인 저지 - 5052번: 전화번호 목록

🔍 문제


 

 

5052번: 전화번호 목록

문제 전화번호 목록이 주어진다. 이때, 이 목록이 일관성이 있는지 없는지를 구하는 프로그램을 작성하시오. 전화번호 목록이 일관성을 유지하려면, 한 번호가 다른 번호의 접두어인 경우가 없어야 한다. 예를 들어, 전화번호 목록이 아래와 같은 경우를 생각해보자 긴급전화: 911 상근: 97 625 999 선영: 91 12 54 26 이 경우에 선영이에게 전화를 걸 수 있는 방법이 없다. 전화기를 들고 선영이 번호의 처음 세 자리를 누르는 순간 바로 긴급전화가

www.acmicpc.net

 

✏️ 풀이 - Java


어떤 값 a를 어떤 값 b가 포함하고 있다면 이를 일관성이 없다고 할 수 있다.
예를 들어서,

911  
93123857  
91158634  

가 있으면 911을 91158634에 포함돼어있어 일관성이 없다고 할 수 있다 이를 이용해서 문제를 풀었다.


값을 String 배열로 받아준 다음에 Arrays.sort를 이용해서 오름차순으로 정렬해준다. 만약 정렬된 입력값 배열에서 다음의 값과 길이가 같으면 완전히 다른 값이기 때문에 건너뛰어준다.(애초에 문제에서 모든 값은 다 다른 값이라고 알려줌) 그리고나서 현재 값의 길이가 다음 값의 길이보다 작은 경우 다음 값이 현재 값을 가지고 있는지 idexOf를 사용해 확인해 준다. indexOf의 결과로 -1이 아닌 다른 값이 나온다면 일관성이 없는 값을 가지고 있는 것이므로 break해주고 NO를 출력하면된다.

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 {
    public static void main(String[] args) throws NumberFormatException, IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        int t = Integer.parseInt(br.readLine()); 

        String[] result = new String[t];

        for(int i = 0; i < t; i++) {
            int N = Integer.parseInt(br.readLine());
            String[] phoneNum = new String[N];
            boolean flag = true;

            for(int k = 0; k < N; k++) {
                phoneNum[k] = br.readLine();
            }

            Arrays.sort(phoneNum);

            for(int j = 0; j < N-1; j++) {
                if(phoneNum[j].length() == phoneNum[j+1].length()) continue; //길이가 같으면 어차피 겹치지 않음
                if(phoneNum[j].length() < phoneNum[j+1].length()) {
                    if(phoneNum[j+1].indexOf(phoneNum[j]) != -1) {
                        flag = false;
                        break;
                    }
                }
            }

            result[i] = flag? "YES\n" : "NO\n";
        }

        for(String s : result) {
            bw.write(s);
        }

        bw.flush();
        bw.close();
        br.close();

    }
}