순간을 성실히, 화려함보단 꾸준함을

[ boj : 22942 ] 데이터 체커 본문

알고리즘,SQL/백준,BOJ

[ boj : 22942 ] 데이터 체커

폭발토끼 2022. 1. 22. 01:14

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

 

22942번: 데이터 체커

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

www.acmicpc.net

해설 : 이 문제 꽤 재밌었습니다.

먼저 원의 교점이 없어야 합니다. 이때 중요한 포인트는 원의 x 좌표만 다를뿐 y 좌표는 동일하다는 것이죠. 즉, 굳이 원으로 표현해줄 필요없이 일직선으로 표현해 줄 수 있다는 것 입니다.

입력이

5 4

3 1

6 1

이런식으로 들어왔다고 하면 그림과 같이 표현해 줄 수 있겠죠. 그러면 NO 가 될 조건은???한 일직선이 다른 일직선 사이에 '걸쳐있으면' 됩니다. 

이렇게 말이죠.

이는 스택을 사용해서 걸러주면 되겠죠?

//package com.boj.practice;

import java.io.*;
import java.security.KeyPair;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
import java.util.StringTokenizer;

import static java.lang.Math.*;

public class Main {
    static FastReader scan = new FastReader();
    //정답은 sb에 append 를 사용하여 출력
    //만약 개행까지 출력하고 싶으면 append('\n')을 추가
    static StringBuilder sb = new StringBuilder();
    static final int SIZE = 1_100_000;

    public static void main(String[] args) {
        input();
    }
    static void input(){
        int n = scan.nextInt();
        int x,y;
        int[] arr = new int[2*SIZE];
        int[] index = new int[SIZE];
        List<Pair> list = new ArrayList<>();

        String ans="YES";
        for(int i=0;i<n;i++){
            x= scan.nextInt();
            y = scan.nextInt();
            list.add(new Pair(x-y,i));
            list.add(new Pair(x+y,i));
            arr[(x-y)+SIZE]+=1;
            arr[(x+y)+SIZE]+=1;
            if(arr[(x-y)+SIZE]>=2 || arr[(x+y)+SIZE]>=2){
                ans="NO";
            }
            index[i]+=2;
        }
        if(ans=="NO"){
            System.out.println(ans);
            return;
        }
        list.sort((A,B)->{
            return A.x<B.x?-1:1;
        });
        //list.forEach(u-> System.out.println(u.x+" "+u.y));
        Stack<Pair> st = new Stack<>();
        for(Pair u : list){
            if(index[u.y]>=2){
                st.push(u);
                index[u.y]-=1;
            }
            else if(st.peek().y==u.y){
                st.pop();
            }
            else{
                ans="NO";
                break;
            }
        }
        System.out.println(ans);
    }
    static class Pair{
        int x,y;

        public Pair(int x, int y) {
            this.x = x;
            this.y = y;
        }
    }
    static class FastReader {
        BufferedReader br;
        StringTokenizer st;
        public FastReader() {
            br = new BufferedReader(new InputStreamReader(System.in));
        }
        public FastReader(String s) throws FileNotFoundException {
            br = new BufferedReader(new FileReader(new File(s)));
        }
        String next() {
            while (st == null || !st.hasMoreElements()) {
                try {
                    st = new StringTokenizer(br.readLine());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return st.nextToken();
        }
        int nextInt() {
            return Integer.parseInt(next());
        }
        long nextLong() {
            return Long.parseLong(next());
        }
        double nextDouble() {
            return Double.parseDouble(next());
        }
        String nextLine() {
            String str = "";
            try {
                str = br.readLine();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return str;
        }
    }
}

'알고리즘,SQL > 백준,BOJ' 카테고리의 다른 글

[ boj : 2343 ] 기타 레슨  (0) 2022.01.28
[ boj : 22868 ] 산책(small)  (0) 2022.01.26
[ boj : 7573 ] 고기잡이  (0) 2022.01.22
[ boj : 1301 ] 비즈 공예  (0) 2022.01.17
[ boj : 22236 ] 가희와 비행기  (0) 2022.01.16