πŸ•οΈ ICPC Sinchon/Greedy

[BOJ][C++] λ°±μ€€ 19598번: μ΅œμ†Œ νšŒμ˜μ‹€ 개수 (Gold V)

선달 2025. 3. 20. 03:54
λ°˜μ‘ν˜•

문제

μ„œμ€€μ΄λŠ” μ•„λΉ λ‘œλΆ€ν„° N개의 회의λ₯Ό λͺ¨λ‘ 진행할 수 μžˆλŠ” μ΅œμ†Œ νšŒμ˜μ‹€ 개수λ₯Ό κ΅¬ν•˜λΌλŠ” λ―Έμ…˜μ„ λ°›μ•˜λ‹€. 각 νšŒμ˜λŠ” μ‹œμž‘ μ‹œκ°„κ³Ό λλ‚˜λŠ” μ‹œκ°„μ΄ 주어지고 ν•œ νšŒμ˜μ‹€μ—μ„œ λ™μ‹œμ— 두 개 μ΄μƒμ˜ νšŒμ˜κ°€ 진행될 수 μ—†λ‹€. λ‹¨, νšŒμ˜λŠ” ν•œλ²ˆ μ‹œμž‘λ˜λ©΄ μ€‘간에 쀑단될 수 μ—†μœΌλ©° ν•œ νšŒμ˜κ°€ λλ‚˜λŠ” 것과 λ™μ‹œμ— λ‹€μŒ νšŒμ˜κ°€ μ‹œμž‘λ  수 μžˆλ‹€. 회의의 μ‹œμž‘ μ‹œκ°„μ€ λλ‚˜λŠ” μ‹œκ°„λ³΄λ‹€ 항상 μž‘λ‹€. N이 λ„ˆλ¬΄ μ»€μ„œ κ΄΄λ‘œμ›Œ ν•˜λŠ” 우리 μ„œμ€€μ΄λ₯Ό λ„μ™€μ£Όμž.

μž…λ ₯

첫째 쀄에 λ°°μ—΄μ˜ 크기 N(1 ≀ N ≀ 100,000)이 주어진닀. λ‘˜μ§Έ 쀄뢀터 N+1 μ€„κΉŒμ§€ κ³΅λ°±μ„ 사이에 두고 회의의 μ‹œμž‘μ‹œκ°„κ³Ό λλ‚˜λŠ” μ‹œκ°„μ΄ 주어진닀. μ‹œμž‘ μ‹œκ°„κ³Ό λλ‚˜λŠ” μ‹œκ°„μ€ 231βˆ’1보닀 μž‘κ±°λ‚˜ 같은 μžμ—°μˆ˜ λ˜λŠ” 0이닀.

좜λ ₯

첫째 쀄에 μ΅œμ†Œ νšŒμ˜μ‹€ 개수λ₯Ό 좜λ ₯ν•œλ‹€.

 

풀이

일단 μ‹œμž‘μ‹œκ°„κ³Ό λλ‚˜λŠ” μ‹œκ°„μ— ν•΄λ‹Ήν•˜λŠ” μˆ«μžκ°€ 크기 λ•Œλ¬Έμ— long long νƒ€μž…μ„ μ¨μ•Όν•˜λŠ” 점을 λͺ…μ‹¬ν•˜μž

 

이 문제의 풀이λ₯Ό μ΄ν•΄ν•˜κ³ μ‹Άλ‹€λ©΄ κ·Έλƒ₯ μ§κ΄€μ μœΌλ‘œ μƒκ°ν•˜λŠ”κ²Œ 제일 νŽΈν•˜λ‹€

1. 회의λ₯Ό λ°°μ •ν•˜κ³  λλ‚˜λŠ” μ‹œκ°„μ„ νšŒμ˜μ‹€μ— ν‘œμ‹œν•œλ‹€

2. λ‹€μŒ 회의의 μ‹œμž‘ μ‹œκ°„μ„ νšŒμ˜μ‹€λ“€μ— ν‘œμ‹œλœ λλ‚˜λŠ” μ‹œκ°„κ³Ό λΉ„κ΅ν•œλ‹€

 

3. μ‹œμž‘ μ‹œκ°„ >= λλ‚˜λŠ” μ‹œκ°„ 인 κ²½μš°κ°€ 있으면 κ·Έ νšŒμ˜μ‹€μ— λ°°μ •, μ—†μœΌλ©΄ μƒˆ νšŒμ˜μ‹€μ— λ°°μ •

νšŒμ˜λ“€μ„ νƒμƒ‰ν•˜λ©΄μ„œ 반볡

 

μ΄λ•Œ 회의λ₯Ό νƒμƒ‰ν• λ•ŒλŠ” μ‹œμž‘μ‹œκ°„μ΄ λΉ λ₯Έ νšŒμ˜λΆ€ν„° λ°°μ •ν•΄μ•Όν•œλ‹€.

μž…λ ₯으둜 받은 회의 μ‹œκ°„μ„ μ •λ ¬ν•˜κ³  μ‹œμž‘ν•˜μž

 

이제 본격적으둜 νšŒμ˜μ‹€μ— 배정을 ν• κ±°λ‹€.

μž„μ˜μ˜ νšŒμ˜μ‹€ 배열을 λ§Œλ“€κ³  각 νšŒμ˜μ‹€μ˜ νšŒμ˜κ°€ λλ‚˜λŠ” μ‹œκ°„μ„ λ„£λŠ” ν˜•νƒœλ‘œ κ΅¬ν˜„ν•œλ‹€.

(νšŒμ˜μ‹€μ— λ°°μ •λœ νšŒμ˜κ°€ λλ‚˜λŠ” μ‹œκ°„μ„ λͺ…μ‹œν•˜λŠ” 것과 동일)

 

μ΄λ•Œ μœ„μ—μ„œ 2번 단계λ₯Ό ν•  λ•Œ <λ°°μ •λœ νšŒμ˜μ‹€ 쀑 λλ‚˜λŠ” μ‹œκ°„μ΄ κ°€μž₯ λΉ λ₯Έ νšŒμ˜μ‹€> ν•˜λ‚˜μ™€ λΉ„κ΅ν•˜λ©΄ λœλ‹€

맀번 κ°€μž₯ μ‹œκ°„μ΄ λΉ λ₯Έκ±Έ μˆœνšŒν•˜λ©° λŒκΈ°μ—” μ‹œκ°„μ΄ λΆ€μ‘±ν•˜λ‹ˆ priority_queue λ₯Ό μ΄μš©ν–ˆλ‹€.

μš°μ„ μˆœμœ„ 큐λ₯Ό μ΄μš©ν•˜λ©΄ pq.top()이 λλ‚˜λŠ”μ‹œκ°„μ΄κ°€μž₯λΉ λ₯ΈνšŒμ˜μ‹€μ˜λλ‚˜λŠ”μ‹œκ°„. 이닀

 

νšŒμ˜λ“€μ„ μ°¨λ‘€λŒ€λ‘œ λ³΄λ©΄μ„œ

νšŒμ˜μ‹€μ— νšŒμ˜κ°€ λ“€μ–΄κ°ˆ 수 있으면 (pq.top() <= ν˜„μž¬νšŒμ˜μ˜ μ‹œμž‘μ‹œκ°„)

κ·Έ νšŒμ˜μ‹€μ— 회의λ₯Ό λ„£κ³  (회의λ₯Ό λΉΌκ³ , ν˜„μž¬ 회의λ₯Ό λ„£μŒ = pq.top(); pq.push(ν˜„μž¬νšŒμ˜λλ‚˜λŠ”μ‹œκ°„))

λ“€μ–΄κ°ˆ 수 μ—†μœΌλ©΄ μƒˆλ‘œμš΄ νšŒμ˜μ‹€μ— λ°°μ •ν•œλ‹€ (κ·Έλƒ₯ μƒˆλ‘œ κ°’ λ„£μŒ = pq.push(ν˜„μž¬νšŒμ˜λλ‚˜λŠ”μ‹œκ°„))

 

// 풀이 : https://whkakrkr.tistory.com

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef pair<ll, ll> ci;

bool cmp(ci a, ci b) {
    return a.first < b.first;
}

int solution(int &n, vector<ci> &v) {
    int ans;
    
    sort(v.begin(), v.end(), cmp);
    
    priority_queue<ll, vector<ll>, greater<>>pq;
    pq.push(v[0].second);
    
    for(int i=1; i<n; i++) {
        ci cur = v[i];
        if(pq.top() <= cur.first) {
            pq.pop();
        }
        pq.push(cur.second);
    }
    
    ans = pq.size();
    
    return ans;
}

int main() {
    ios_base::sync_with_stdio(false);
	cout.tie(NULL);
	cin.tie(NULL);
	
	int n;
	cin >> n;
	vector<ci>v(n);
	ll a,b;
	for(int i=0; i<n; i++) {
	    cin >> a >> b;
	    v[i] = {a,b};
	}
	
	cout << solution(n,v);
	
    return 0;
}
λ°˜μ‘ν˜•