algorithm

[์ฝ”๋“œํŠธ๋ฆฌ ์กฐ๋ณ„๊ณผ์ œ] +1 -1 Technique

rkawk 2024. 7. 17. 15:55

์–ด์ œ ํ•ด๋ดค๋Š”๋ฐ ์—ฌ๊ธฐ์„œ ํ‹€๋ ธ๋‹ค. ์•„์‰ฝ๋‹ค ์•„๋ž˜ ๋ฌธ์ œ์˜ ์‘์šฉ๋ฌธ์ œ๊ฐ€ ๋‚˜์™”๋Š”๋ฐ ๋ชปํ’€์—ˆ๋‹ค.

๊ธฐ๋ณธ ๊ฐœ๋…

1์ฐจ ์ˆ˜์ง์„  ์ƒ์— n๊ฐœ์˜ ์„ ๋ถ„์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, 
x = k ์ง์„ ๊ณผ ๋งŒ๋‚˜๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ์„ ๋ถ„์˜ ์ˆ˜๋Š” ๋ช‡ ๊ฐœ์ธ์ง€๋ฅผ ํŒ๋‹จํ•˜๋Š” 
ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•ด๋ณด์„ธ์š”.
๋‹จ, ์ฃผ์–ด์ง€๋Š” x ์ขŒํ‘œ๋Š” ๋ชจ๋‘ ๋‹ค๋ฆ„์„ ๊ฐ€์ •ํ•ด๋„ ์ข‹์Šต๋‹ˆ๋‹ค.

 

๋ฌธ์ œ๋ฅผ ๊ฐ€์‹œ์ ์œผ๋กœ ๋‚˜ํƒ€๋‚ด๋ฉด 2๊ฐœ๋ผ๋Š” ๊ฒƒ์„ ์‰ฝ๊ฒŒ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ด ๊ฐ€์‹œ์„ฑ์„ ์ปดํ“จํ„ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ์‰ฝ๊ฒŒ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด์„œ๋Š” 

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹œ์ž‘์ ์— +1, ๋ ์ ์— -1์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

K๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ทธ๋ณด๋‹ค ์™ผ์ชฝ์— ์žˆ๋Š” ์ ๋“ค์„ ์ƒ๊ฐํ•˜์—ฌ ๋งŒ์•ฝ ๋ ์ ์ด k๋ณด๋‹ค ์ž‘๋‹ค๋ฉด k์™€ ๊ฒน์น˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์‹œ์ž‘์ ์˜ ๊ฐ’ +1 + ๋์ ์˜ ๊ฐ’ -1์„ ํ•˜๋ฏ€๋กœ 0์ด๋œ๋‹ค.

K๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ทธ๋ณด๋‹ค ์‹œ์ž‘์ ์ด ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š” ์  ๋˜ํ•œ ๋งˆ์ฐฌ๊ฐ€์ง€์ด๋ฉฐ ๋งŒ์•ฝ ๊ฒน์น˜๋Š” ์ ์ด ์ƒ๊ธธ ๊ฒฝ์šฐ ์‹œ์ž‘์ ์ด +1์ด๋ฏ€๋กœ ๊ฒน์น˜๋Š” ๊ตฌ๊ฐ„ +1๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋ ‡๊ฒŒ ๋œ๋‹ค๋ฉด ํŠน์ •ํ•œ ๊ตฌ๊ฐ„ ๋ฐ ์ ์— ๊ฒน์น˜๋Š” ๊ตฌ๊ฐ„์˜ ๊ฐœ์ˆ˜๋ฅผ 2 * N(์‹œ์ž‘์ , ๋์ )์œผ๋กœ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค.

 

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int n, chk, ans;
vector<pair<int, int>>v;
int main() {
    cin>>n;
    for(int i=0; i<n; i++) {
        int l, r; cin>>l>>r;
        v.push_back(make_pair(l, 1));
        v.push_back(make_pair(r, -1));
    }
    sort(v.begin(), v.end());
    for(auto point : v) {
        chk += point.second;
        ans = max(ans, chk);
    }
    cout<<ans;
    return 0;
}

์ด๋ฅผ ์‘์šฉํ•ด์„œ ๊ฐ€์žฅ ๋งŽ์ด ๊ฒน์น˜๋Š” ๊ตฌ๊ฐ„์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

์‹œ์ž‘์ ์€ ๋ฌด์กฐ๊ฑด +1, ๋์ ์€ ๋ฌด์กฐ๊ฑด -1์ด๋ผ๋Š” ์ ์„ ์ด์šฉํ•ด์„œ ํ•ด๋‹น ์ •๋ณด๋ฅผ pair vector์— ์ง‘์–ด๋„ฃ๊ณ  ์ •๋ ฌํ•œ ํ›„์— ์ˆœ์ฐจํƒ์ƒ‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ๊ตฌํ˜„ํ–ˆ๋‹ค.

 

์‘์šฉ1 ) ๊ตฌ๊ฐ„์˜ ์ด ๊ฐœ์ˆ˜

๋ชจ๋“  ๊ตฌ๊ฐ„์„ ์‹ค์„ ์œผ๋กœ ์—ฐ๊ฒฐํ•œ๋‹ค๋ฉด, ๊ตฌ๊ฐ„์ด ๋Š์–ด์ง€๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋Ÿฐ ๊ฒฝ์šฐ ๊ตฌ๊ฐ„์ด ๋Š์–ด์ง€๋Š” ๊ฐœ์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ ์„œ๋กœ ๋‹ค๋ฅธ ๊ตฌ๊ฐ„์˜ ์ˆ˜๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int n, chk, ans;
vector<pair<int,int>>v;
bool cmp(pair<int,int>&a, pair<int,int>&b) {
    if(a.first == b.first)
        return a.second > b.second;
    else return a.first < b.first;
}
int main() {
    cin>>n;
    for(int i=0; i<n; i++){
        int l, r; cin>>l>>r;
        v.push_back({l, 1});
        v.push_back({r, -1});
    }
    sort(v.begin(), v.end(), cmp);
    for(int i=0; i<v.size(); i++) {
        if(i==0) chk += v[i].second;
        else {
            chk += v[i].second;
            if(chk == 0) ans += 1;
        }
    }
    cout<<ans;
    return 0;
}

 

chk์˜ ๊ฐ’์€ ๊ตฌ๊ฐ„์— ๊ฒน์นœ ์‹ค์„ ์˜ ์ˆ˜๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

์‹ค์„ ์˜ ์ˆ˜๋Š” [0, ~)์˜ ๊ฐ’์ด๊ณ , ์–‘์˜ ์ •์ˆ˜์—์„œ 0์ด ๋˜๋Š” ์ˆœ๊ฐ„์ด ์„œ๋กœ ๋‹ค๋ฅธ ๊ตฌ๊ฐ„์ด ๋˜๋Š” ๊ฒฝ์šฐ์ด๋‹ค. ( ๋ฌด์กฐ๊ฑด ์„œ๋กœ ๋‹ค๋ฅธ ์ขŒํ‘œ๊ฐ€ ๋“ค์–ด์˜จ๋‹ค๋Š” ๊ฐ€์ •. ๊ฐ™์€ ์ขŒํ‘œ๊ฐ€ ๋“ค์–ด์˜จ๋‹ค๋ฉด ๋ฌธ์ œ์˜ ์ •์˜์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง.)

๊ทธ๋Ÿฌ๋ฏ€๋กœ chk๊ฐ€ 0์ด๋˜๋Š” ์ˆœ๊ฐ„ ์„œ๋กœ ๋‹ค๋ฅธ ๊ตฌ๊ฐ„์˜ ์ˆ˜๋ฅผ 1์”ฉ ๋Š˜๋ ค์ฃผ๋ฉด ๋œ๋‹ค.

'algorithm' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

๋ฐฑ์ค€ 21870  (0) 2024.07.30
[์ฝ”๋“œํŠธ๋ฆฌ ์กฐ๋ณ„๊ณผ์ œ] Preprocessing  (1) 2024.07.24
๋ฐฑ์ค€ 1593  (1) 2024.07.08
๋ฐฑ์ค€ 2482  (0) 2024.06.26
๋ฐฑ์ค€ 31846  (0) 2024.06.24