Study/Problem Solving

[BOJ_22942] 데이터 체커

monitor 2023. 11. 4. 16:18

설명


내가 짠 코드이지만 찝찝하다.

4
5 4
3 1
6 1
9 1

 

입력시 사실 NO가 나와야하는데 YES가 나오는 코드이다.

 

지금 들어오는 첫번째의 케이스와 마지막 케이스가 접점이 존재하는데 맞았다는 케이스로 뜨게 된다.

 

내가 생각을 잘 못하고 있는건지 잘 파악이 되지 않아서 공유한다. 아래 코드는 PriorityQueue 즉 최소힙을 활용하였고 Comparable로 맨 앞에 스타팅 지점 기준으로 오름차순 정렬하였다.

 

코드


package Data_Structure;
import java.util.*;
import java.io.*;
public class BOJ_22942 {
    static class Data implements Comparable<Data>{
        int start;
        int end;


        int r;
        public Data(int start, int end, int r){
            this.start = start;
            this.end = end;
            this.r = r;
        }

        @Override
        public int compareTo(Data o) {
            return Integer.compare(this.start, o.start); //끝 지점끼리 비교
        }
    }
    public static void main(String[] args) throws Exception{
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer tk = new StringTokenizer(in.readLine()," ");

        int N = Integer.parseInt(tk.nextToken());

        PriorityQueue<Data> pq = new PriorityQueue<>();

        for(int i = 0; i < N; i++){
            tk = new StringTokenizer(in.readLine()," ");
            int x = Integer.parseInt(tk.nextToken());

            int r = Integer.parseInt(tk.nextToken());

            pq.add(new Data((x - r),(x + r),r));

        }

        for(int i = 0; i < N; i++){
            Data now = pq.poll();

            int now_d = now.start + now.r;
            if(pq.isEmpty()){
                System.out.println("YES");
                break;
            }else {
                int d = Math.abs((pq.peek().r + pq.peek().start) - now_d);

                if(now.r + pq.peek().r < d){
                    continue;
                }
                else if(Math.abs(now.r - pq.peek().r) > d){
                    continue;
                }else if(d == now.r + pq.peek().r || d == Math.abs(now.r - pq.peek().r)){
                    System.out.println("NO");
                    break;
                }else{
                    System.out.println("NO");
                    break;
                }
            }
        }
    }
}
 

22942번: 데이터 체커

데이터가 조건에 맞는다면 YES, 조건에 만족하지 않는다면 NO를 출력한다.

www.acmicpc.net