λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
✨ Algorithm

[λ°±μ€€/C++] 1931번 : νšŒμ˜μ‹€ λ°°μ •

by nitronium102 2021. 8. 15.

문제

ν•œ 개의 νšŒμ˜μ‹€μ΄ μžˆλŠ”λ° 이λ₯Ό μ‚¬μš©ν•˜κ³ μž ν•˜λŠ” N개의 νšŒμ˜μ— λŒ€ν•˜μ—¬ νšŒμ˜μ‹€ μ‚¬μš©ν‘œλ₯Ό λ§Œλ“€λ €κ³  ν•œλ‹€. 각 회의 I에 λŒ€ν•΄ μ‹œμž‘μ‹œκ°„κ³Ό λλ‚˜λŠ” μ‹œκ°„μ΄ μ£Όμ–΄μ Έ 있고, 각 νšŒμ˜κ°€ κ²ΉμΉ˜μ§€ μ•Šκ²Œ ν•˜λ©΄μ„œ νšŒμ˜μ‹€μ„ μ‚¬μš©ν•  수 μžˆλŠ” 회의의 μ΅œλŒ€ 개수λ₯Ό μ°Ύμ•„λ³΄μž. 단, νšŒμ˜λŠ” ν•œλ²ˆ μ‹œμž‘ν•˜λ©΄ 쀑간에 쀑단될 수 μ—†μœΌλ©° ν•œ νšŒμ˜κ°€ λλ‚˜λŠ” 것과 λ™μ‹œμ— λ‹€μŒ νšŒμ˜κ°€ μ‹œμž‘λ  수 μžˆλ‹€. 회의의 μ‹œμž‘μ‹œκ°„κ³Ό λλ‚˜λŠ” μ‹œκ°„μ΄ 같을 μˆ˜λ„ μžˆλ‹€. 이 κ²½μš°μ—λŠ” μ‹œμž‘ν•˜μžλ§ˆμž λλ‚˜λŠ” κ²ƒμœΌλ‘œ μƒκ°ν•˜λ©΄ λœλ‹€.

μž…λ ₯

첫째 쀄에 회의의 수 N(1 ≤ N ≤ 100,000)이 주어진닀. λ‘˜μ§Έ 쀄뢀터 N+1 μ€„κΉŒμ§€ 각 회의의 정보가 μ£Όμ–΄μ§€λŠ”λ° 이것은 곡백을 사이에 두고 회의의 μ‹œμž‘μ‹œκ°„κ³Ό λλ‚˜λŠ” μ‹œκ°„μ΄ 주어진닀. μ‹œμž‘ μ‹œκ°„κ³Ό λλ‚˜λŠ” μ‹œκ°„μ€ 2^31-1보닀 μž‘κ±°λ‚˜ 같은 μžμ—°μˆ˜ λ˜λŠ” 0이닀.

좜λ ₯

첫째 쀄에 μ΅œλŒ€ μ‚¬μš©ν•  수 μžˆλŠ” 회의의 μ΅œλŒ€ 개수λ₯Ό 좜λ ₯ν•œλ‹€.

풀이

λŒ€ν‘œμ μΈ 그리디 μ•Œκ³ λ¦¬μ¦˜

쑰건 : μ΅œλŒ€ 회의의 수λ₯Ό κ΅¬ν•˜κΈ° μœ„ν•΄μ„œλŠ” μ’…λ£Œμ‹œκ°„μ„ κΈ°μ€€μœΌλ‘œ 선택해야 ν•œλ‹€.

  • λ§Œμ•½ μ‹œμž‘μ‹œκ°„μ„ κΈ°μ€€μœΌλ‘œ μž‘λŠ”λ‹€λ©΄ (0, 10)이 μžˆμ„ λ•Œ (1, 4)와 (5, 6)이 λ“€μ–΄κ°ˆ 수 μ—†κΈ° λ•Œλ¬Έμ— μ΅œλŒ€ 회의의 수λ₯Ό ꡬ할 수 μ—†λ‹€.
  • μ’…λ£Œ μ‹œκ°„μœΌλ‘œ μ˜€λ¦„μ°¨μˆœ 정렬을 ν•œ ν›„, μ’…λ£Œ μ‹œκ°„μ΄ 같을 κ²½μš°μ—λŠ” μ‹œμž‘ μ‹œκ°„μ„ κΈ°μ€€μœΌλ‘œ μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬ν•œλ‹€.
  • μ •λ ¬ν•œ 배열을 순차적으둜 λŒλ©΄μ„œ, ν˜„μž¬ μ’…λ£Œ μ‹œκ°„λ³΄λ‹€ λ‚˜μ€‘μ— μžˆλŠ” μ‹œμž‘ μ‹œκ°„μ΄ μžˆμ„ λ•Œ 회의 수λ₯Ό 늘렀주고, ν˜„μž¬μ’…λ£Œ μ‹œκ°„μ„ λ‹€μŒ 회의의 μ’…λ£Œ μ‹œκ°„μœΌλ‘œ λ°”κΎΈμ–΄μ€€λ‹€.
    #include <iostream>
    #include <vector>
    #include <algorithm> // sort
    using namespace std;
    
    vector<pair<int, int>> v;
    
    bool compare(pair<int, int>a, pair<int, int> b){
      // first : μ‹œμž‘ μ‹œκ°„(첫 번째 인수)
      // second : μ’…λ£Œ μ‹œκ°„(두 번째 인수)
    
      // λλ‚˜λŠ” μ‹œκ°„ κ°™μœΌλ©΄ μ‹œμž‘ μ‹œκ°„ λΉ λ₯Έ 것을 μ•žμœΌλ‘œ
      if (a.second == b.second){ 
        return a.first < b.first;
      }
      // κΈ°λ³Έμ μœΌλ‘œλŠ” μ’…λ£Œ μ‹œκ°„ λΉ λ₯Έ 것을 μ•žμœΌλ‘œ
      else
        return a.second < b.second;
    
    }
    
    int main(){
      int N, start, end;
      cin >> N;
      // vector에 λ„£κΈ°
      for (int i=0; i<N; i++){
        cin >> start >> end;
        v.push_back({start, end});
      }
    
      // μ •λ ¬
      sort(v.begin(), v.end(), compare);
    
      int occupy = v[0].second;
      int cnt = 1;
      for (int i=1; i<N; i++){
        if (occupy <= v[i].first){
          cnt++;
          occupy = v[i].second;
        }
      }
      cout << cnt;
    }​

 


이퍼 μ—°μŠ΅λ¬Έμ œλž‘ λ˜‘κ°™μ•„μ„œ νŽΈν•˜κ²Œ ν’€ 수 μžˆμ—ˆλ‹€. μ΄νΌλŠ” μ—¬κΈ°μ—μ„œ νšŒμ˜μ‹€μ΄ 2개인 버전이라 s1, s2λ₯Ό 인자둜 놓고 λ°”κΎΈμ–΄μ£Όμ—ˆλ‹€. 

λŒ“κΈ€