본문 바로가기
코테준비/하루한개도전~

백준 : 22942 - 데이터 체커

by 움바둠바 2024. 9. 17.
728x90

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

 

앗 오늘도 수많은 삽질끝에,,,,,,

 

첨에는 냅다 완전탐색으로 풀었다.. 근데 역시나 20%에서 시간초과!!

근데 어떤 자료구조를 쓰라는건지...........했는데

정답은 stack이었다!

어짜피 x축위에 있으므로, 괄호처럼 보면 된다.

 

이렇게 왼쪽끝, 오른쪽끝을 각각 ()에 대입해보면 된다!

 

이러면,,,,, 진짜 그냥 맞는괄호찾기 문제가 된다

 

#include <iostream>
#include <vector>
#include <queue>
#include <stack>
using namespace std;

struct compare{
    bool operator()(vector<int> &a, vector<int> &b){
        return a[0] >= b[0];
    }
};

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    int n;
    cin >> n;
    priority_queue<vector<int>, vector<vector<int>>, compare> myones; // {좌표, index, 0 (L) 1 (R)}
        for(int i = 0; i<n; i++){
        int x, r;
        cin >> x >> r;
        myones.push({x-r, i, 0});
        myones.push({x+r, i, 1});
    }

    
    stack<vector<int>> mystack;

    while(!myones.empty()){
        vector<int> nowin = myones.top();
        myones.pop();
        switch(nowin[2]){
            case 0:
                mystack.push(nowin);
                break;
            case 1:
                if(mystack.empty()){
                    cout << "NO";
                    return 0;
                }
                if(mystack.top()[2] == 0 && mystack.top()[1] == nowin[1]){
                    // 가능!
                    mystack.pop();
                    continue;
                }
                cout << "NO";
                return 0;
                break;
        }
    }

    if(mystack.empty()){
        cout << "YES";
    }else{
        cout << "NO";
    }
    

    return 0;
}

 

 

주의할점은 compare 비교조건인데.. 등호를 넣어줘야 통과한다!

이렇게 겹치는 부분은,,,, 잘못하면 검출이 안될 수 있다!

구현에 따라 두가지 경우가 나올 수 있고,,, 이걸 방지해줘야한다! 1번으로 들어가면 맞다고 해버리기 때문이다.

 

근데 저것도 좀 애매하긴하다.. 그냥 테스트케이스만 통과했지,,, 안될지두??

728x90

'코테준비 > 하루한개도전~' 카테고리의 다른 글

softeer : 거리합 구하기  (0) 2024.09.27
softeer : 비밀메뉴2  (1) 2024.09.18
백준 : 2493 - 탑  (0) 2024.09.17
softeer : 로드 밸런서 트래픽 예측  (2) 2024.09.14
백준 : 2504 - 괄호의 값  (0) 2024.09.12