[문제 보기]

8998. 세운이는 내일 할거야

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

[풀이과정]

 입력값으로 주는 데이터를 vector로 받아 sort를 시켜준다. 이때 cmp() 함수를 따로 만들어 규칙을 정해주었다.

 

cmp()

  -> 입력값으로 받은 y값을 기준으로 오름차순으로 정렬시켜주는데, 이때 y값이 같을 경우 x값을 기준으로

      오름차순시켜준다.

 

 그러고 나서 정렬된 vector를 가지고 풀이를 진행하는데, 제일 큰 값을 가지고 처음 start_day를 계산해주고,

 pop_back()을 해준다. 그리고 나서 while()을 사용하여 vector가 empty()될 때까지 수행을 한다. 

 이때, 맨 마지막으로 있는 vector값 순으로 계산을 해주는데, 하루에 과제를 하나만 할 수 있다고 나와있으므로, 

 겹치는 날이 나올 수 있기 때문에 ed값이 현재 start_day보다 클 경우 sd - (ed - start_day)을 해주어 날짜를 댕겨주고, 

 아닐 경우 start_day = sd로 바꿔주는 연산을 해준다. 

 

[소스보기]

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
struct homework{
    int x;
    int y;
};
vector<homework> work;

bool cmp(homework a, homework b){
    if(a.y == b.y)
        return a.x < b.x;
    else
        return a.y < b.y;

}

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

    int T;
    cin >> T;
    for(int test = 1; test <= T; test++){
        int n;
        cin >> n;
        for(int i=0; i<n; i++){
            int x, y;
            cin >> x >> y;
            work.push_back({x,y});
        }

        sort(work.begin(), work.end(), cmp);

        int start_day = work.back().y - work.back().x;
        work.pop_back();

        while(!work.empty()){
            int ed = work.back().y;
            int sd = work.back().y - work.back().x;
            work.pop_back();

            if(ed >= start_day)
                start_day = sd - (ed - start_day);
            else
                start_day = sd;

        }
        cout << "#" << test << " " << start_day << "\n";
    }
    return 0;
}

 

[해결과정 중 실수한 부분]