๐Ÿ•๏ธ ICPC Sinchon/Greedy

[BOJ G5][C++] ๋ฐฑ์ค€ 11000๋ฒˆ: ๊ฐ•์˜์‹ค ๋ฐฐ์ • (์‹œ๊ฐ„์ดˆ๊ณผ)

์„ ๋‹ฌ 2022. 10. 11. 02:42
๋ฐ˜์‘ํ˜•

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

 

11000๋ฒˆ: ๊ฐ•์˜์‹ค ๋ฐฐ์ •

์ฒซ ๋ฒˆ์งธ ์ค„์— N์ด ์ฃผ์–ด์ง„๋‹ค. (1 ≤ N ≤ 200,000) ์ดํ›„ N๊ฐœ์˜ ์ค„์— Si, Ti๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (0 ≤ Si < Ti ≤ 109)

www.acmicpc.net

 

๋ฌธ์ œ

์ˆ˜๊ฐ•์‹ ์ฒญ์˜ ๋งˆ์Šคํ„ฐ ๊น€์ข…ํ˜œ ์„ ์ƒ๋‹˜์—๊ฒŒ ์ƒˆ๋กœ์šด ๊ณผ์ œ๊ฐ€ ์ฃผ์–ด์กŒ๋‹ค. 

๊น€์ข…ํ˜œ ์„ ์ƒ๋‹˜ํ•œํ…Œ๋Š” Si์— ์‹œ์ž‘ํ•ด์„œ Ti์— ๋๋‚˜๋Š” N๊ฐœ์˜ ์ˆ˜์—…์ด ์ฃผ์–ด์ง€๋Š”๋ฐ, ์ตœ์†Œ์˜ ๊ฐ•์˜์‹ค์„ ์‚ฌ์šฉํ•ด์„œ ๋ชจ๋“  ์ˆ˜์—…์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์•ผ ํ•œ๋‹ค. 

์ฐธ๊ณ ๋กœ, ์ˆ˜์—…์ด ๋๋‚œ ์งํ›„์— ๋‹ค์Œ ์ˆ˜์—…์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค. (์ฆ‰, Ti ≤ Sj ์ผ ๊ฒฝ์šฐ i ์ˆ˜์—…๊ณผ j ์ˆ˜์—…์€ ๊ฐ™์ด ๋“ค์„ ์ˆ˜ ์žˆ๋‹ค.)

์ˆ˜๊ฐ•์‹ ์ฒญ ๋Œ€์ถฉํ•œ ๊ฒŒ ์ฐ”๋ฆฌ๋ฉด, ์„ ์ƒ๋‹˜์„ ๋„์™€๋“œ๋ฆฌ์ž!

์ž…๋ ฅ

์ฒซ ๋ฒˆ์งธ ์ค„์— N์ด ์ฃผ์–ด์ง„๋‹ค. (1 ≤ N ≤ 200,000)

์ดํ›„ N๊ฐœ์˜ ์ค„์— Si, Ti๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (0 ≤ Si < Ti ≤ 109)

์ถœ๋ ฅ

๊ฐ•์˜์‹ค์˜ ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•˜๋ผ.

 

ํ’€์ด

4%์—์„œ ํ‹€๋ ธ์Šต๋‹ˆ๋‹ค ๊ฐ€ ๋œฌ๋‹ค๋ฉด

๊ฐ•์˜๋ฅผ ์•Œ๋งž๊ฒŒ ์ •๋ ฌํ–ˆ๋Š”์ง€ ํ™•์ธํ•ด๋ณด์ž
๋๋‚˜๋Š”์‹œ๊ฐ„์ด ๋น ๋ฅธ ์ˆœ์œผ๋กœ ํ•˜๋ฉด ์•ˆ๋œ๋‹ค. ๊ฐ•์˜์‹œ๊ฐ„(๋-์‹œ์ž‘)์ด ์งง์„์ˆ˜๋ก ๋จผ์ € ๋ฐฐ์ •ํ•ด์•ผํ•œ๋‹ค

๋ณธ ๋ฌธ์ œ์—์„œ๋Š” {์‹œ์ž‘์‹œ๊ฐ„, ๋๋‚˜๋Š”์‹œ๊ฐ„} ์„ pair ์ž๋ฃŒํ˜•์„ ์ด์šฉํ•˜์—ฌ sort๋ฅผ ํ•ด์ฃผ์–ด ํ•œ๋ฒˆ์— ์ •๋ ฌํ–ˆ๋‹ค

 

์‹œ๊ฐ„์ดˆ๊ณผ ๊ฐ€ ๋œฌ๋‹ค๋ฉด

๋ณธ ๋ฌธ์ œ์˜ ์ž…๋ ฅ์ด ๋งค์šฐ ๋งŽ์œผ๋ฏ€๋กœ O(n^2) ์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋กœ๋Š” ํ’€์ด๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์ ์„ ์ฐธ๊ณ ํ•˜์ž (์•„๋ž˜์•„๋ž˜ ์‹œํ–‰์ฐฉ์˜ค ์ฐธ๊ณ )

 

// Authored by : seondal
// Co-authored by : -

// #include <bits/stdc++.h>
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>

using namespace std;

typedef pair<int, int> p;  // {์‹œ์ž‘์‹œ๊ฐ„, ๋๋‚˜๋Š”์‹œ๊ฐ„}

int solution(int n, vector<p> &lecture) {
    priority_queue<int, vector<int>, greater<int>> room; // room.top() = ์‚ฌ์šฉ์ค‘์ธ ๊ฐ•์˜์‹ค์ค‘ ๊ฐ€์žฅ ๋นจ๋ฆฌ ๋๋‚˜๋Š” ๊ฐ•์˜์‹ค์˜ ๋๋‚˜๋Š” ์‹œ๊ฐ„
    
    sort(lecture.begin(), lecture.end()); // ์‹œ์ž‘์‹œ๊ฐ„์ด ๋น ๋ฅธ ์ˆœ์„œ๋Œ€๋กœ ์ •๋ ฌ (์‹œ์ž‘์‹œ๊ฐ„์ด ๊ฐ™๋‹ค๋ฉด ๋๋‚˜๋Š” ์‹œ๊ฐ„์ด ๋น ๋ฅธ ์ˆœ์„œ)
    
    for(int i=0; i<n; i++) {
        if(!room.empty() && room.top() <= lecture[i].first)
            // ๊ฐ€์žฅ ๋นจ๋ฆฌ ๋๋‚  ๊ฐ•์˜์‹ค์˜ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ํ•ด๋‹น ๊ฐ•์˜์‹ค์— ๊ฐ•์˜ ๋ฐฐ์ •
            room.pop();
        
        room.push(lecture[i].second);  // ๊ฐ€์žฅ ๋นจ๋ฆฌ ๋๋‚  ๊ฐ•์˜์‹ค์˜ ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ์ƒˆ ๊ฐ•์˜์‹ค์— ๊ฐ•์˜ ๋ฐฐ์ •
    }
    
    return room.size();
}

int main() {
    ios_base :: sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);
    
    int n;
    cin >> n;
    vector<p> lecture(n, {0,0});
    for(int i=0; i<n; i++)
        cin >> lecture[i].first >> lecture[i].second;
    
    cout << solution(n,lecture);

    return 0;
}

/*
 */

 

์‹œํ–‰์ฐฉ์˜ค

์ฒ˜์Œ์—๋Š” ํŽธํ•˜๊ฒŒ ๊ตฌํ˜„ํ–ˆ์œผ๋‚˜ ๊ฐ•์˜์‹ค์„ ๋ฐฐ์ •ํ•˜๋Š” ๊ณผ์ •์—์„œ ์ด์ค‘ for๋ฌธ์„ ๋Œ๋ ค ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ O(n^2)๊ฐ€ ๋˜์—ˆ๊ณ ,

๋”๋ณด๊ธฐ
// Authored by : seondal
// Co-authored by : -

// #include <bits/stdc++.h>
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

typedef pair<int, int> p;  // {์‹œ์ž‘์‹œ๊ฐ„, ๋๋‚˜๋Š”์‹œ๊ฐ„}

int solution(int n, vector<p> &lecture) {
    vector<int> room(n,0); // room[i] = i๋ฒˆ ๊ฐ•์˜์‹ค์˜ ๋งˆ์ง€๋ง‰ ์ˆ˜์—…์ด ๋๋‚œ ์‹œ๊ฐ„, ๊ฐ•์˜์‹ค์˜ ์ตœ๋Œ€ ๊ฐœ์ˆ˜๋Š” n์„ ๋„˜์ง€ ์•Š์Œ
    
    sort(lecture.begin(), lecture.end()); // ์‹œ์ž‘์‹œ๊ฐ„์ด ๋น ๋ฅธ ์ˆœ์„œ๋Œ€๋กœ ์ •๋ ฌ
    
    for(int i=0; i<n; i++) {
        for(int j=0; j<n; j++) {
            // ๊ฐ•์˜์‹ค ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด(๊ฐ•์˜์‹ค๋๋‚˜๋Š”์‹œ๊ฐ„ <= ๊ฐ•์˜์‹œ์ž‘์‹œ๊ฐ„) ๊ฐ•์˜ ๋ฐฐ์ •
            if(room[j] <= lecture[i].first) {
                room[j] = lecture[i].second;
                break;
            }
        }
    }

    int maxRoom=0;
    for(int i=0; i<n; i++) // ๊ฐ•์˜๊ฐ€ ๋ฐฐ์ •๋œ(room[i]๊ฐ€ 0์ด ์•„๋‹Œ) ๊ฐ•์˜์‹ค์˜ ์ˆ˜ ์นด์šดํŠธ
        if(room[i]>0)
            maxRoom++;
    return maxRoom;
}

int main() {
    ios_base :: sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);
    
    int n;
    cin >> n;
    vector<p> lecture(n, {0,0});
    for(int i=0; i<n; i++)
        cin >> lecture[i].first >> lecture[i].second;
    
    cout << solution(n,lecture);

    return 0;
}

/*
 */

์‹œ๊ฐ„ ์กฐ๊ฑด์ด ๊นŒ๋‹ค๋กœ์šด ๋ณธ ๋ฌธ์ œ ํŠน์„ฑ์ƒ ๋ฐ”๋กœ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋–ด๋‹ค..

๊ฐ•์˜์‹ค์— ํ•ด๋‹นํ•˜๋Š” ๋ถ€๋ถ„์„ ์šฐ์„ ์ˆœ์œ„ํ (priority_queue, ํž™(heap)) ๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•˜๊ณ  ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๋‚ฎ์ถฐ์„œ ์„ฑ๊ณตํ–ˆ๋‹ค.

๋ฐ˜์‘ํ˜•