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

[λ°±μ€€/C++] 1946번 : μ‹ μž… 사원

by nitronium102 2021. 9. 6.

문제

μ–Έμ œλ‚˜ μ΅œκ³ λ§Œμ„ 지ν–₯ν•˜λŠ” κ΅΄μ§€μ˜ λŒ€κΈ°μ—… μ§„μ˜ μ£Όμ‹νšŒμ‚¬κ°€ μ‹ κ·œ 사원 μ±„μš©μ„ μ‹€μ‹œν•œλ‹€. 인재 μ„ λ°œ μ‹œν—˜μ€ 1μ°¨ μ„œλ₯˜μ‹¬μ‚¬μ™€ 2μ°¨ λ©΄μ ‘μ‹œν—˜μœΌλ‘œ 이루어진닀. μ΅œκ³ λ§Œμ„ 지ν–₯ν•œλ‹€λŠ” κΈ°μ—…μ˜ 이념에 따라 그듀은 졜고의 μΈμž¬λ“€λ§Œμ„ μ‚¬μ›μœΌλ‘œ μ„ λ°œν•˜κ³  μ‹Άμ–΄ ν•œλ‹€.

κ·Έλž˜μ„œ μ§„μ˜ μ£Όμ‹νšŒμ‚¬λŠ”, λ‹€λ₯Έ λͺ¨λ“  μ§€μ›μžμ™€ λΉ„κ΅ν–ˆμ„ λ•Œ μ„œλ₯˜μ‹¬μ‚¬ 성적과 λ©΄μ ‘μ‹œν—˜ 성적 쀑 적어도 ν•˜λ‚˜κ°€ λ‹€λ₯Έ μ§€μ›μžλ³΄λ‹€ 떨어지지 μ•ŠλŠ” 자만 μ„ λ°œν•œλ‹€λŠ” 원칙을 μ„Έμ› λ‹€. 즉, μ–΄λ–€ μ§€μ›μž A의 성적이 λ‹€λ₯Έ μ–΄λ–€ μ§€μ›μž B의 성적에 λΉ„ν•΄ μ„œλ₯˜ 심사 결과와 λ©΄μ ‘ 성적이 λͺ¨λ‘ 떨어진닀면 AλŠ” κ²°μ½” μ„ λ°œλ˜μ§€ μ•ŠλŠ”λ‹€.

μ΄λŸ¬ν•œ 쑰건을 λ§Œμ‘±μ‹œν‚€λ©΄μ„œ, μ§„μ˜ μ£Όμ‹νšŒμ‚¬κ°€ 이번 μ‹ κ·œ 사원 μ±„μš©μ—μ„œ μ„ λ°œν•  수 μžˆλŠ” μ‹ μž…μ‚¬μ›μ˜ μ΅œλŒ€ μΈμ›μˆ˜λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

μž…λ ₯

첫째 μ€„μ—λŠ” ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ˜ 개수 T(1 ≤ T ≤ 20)κ°€ 주어진닀. 각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ˜ 첫째 쀄에 μ§€μ›μžμ˜ 숫자 N(1 ≤ N ≤ 100,000)이 주어진닀. λ‘˜μ§Έ 쀄뢀터 N개 μ€„μ—λŠ” 각각의 μ§€μ›μžμ˜ μ„œλ₯˜μ‹¬μ‚¬ 성적, λ©΄μ ‘ μ„±μ μ˜ μˆœμœ„κ°€ 곡백을 사이에 두고 ν•œ 쀄에 주어진닀. 두 성적 μˆœμœ„λŠ” λͺ¨λ‘ 1μœ„λΆ€ν„° Nμœ„κΉŒμ§€ 동석차 없이 κ²°μ •λœλ‹€κ³  κ°€μ •ν•œλ‹€.

좜λ ₯

각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ— λŒ€ν•΄μ„œ μ§„μ˜ μ£Όμ‹νšŒμ‚¬κ°€ μ„ λ°œν•  수 μžˆλŠ” μ‹ μž…μ‚¬μ›μ˜ μ΅œλŒ€ μΈμ›μˆ˜λ₯Ό ν•œ 쀄에 ν•˜λ‚˜μ”© 좜λ ₯ν•œλ‹€.

풀이

주어진 μ˜ˆμ‹œκ°€ 각 μ§€μ›μžλ“€μ˜ μ μˆ˜κ°€ μ•„λ‹Œ "μˆœμœ„"λΌλŠ” 것을 μ•Œμ•„μ•Ό ν•œλ‹€! 즉, μˆ«μžκ°€ μž‘μ„μˆ˜λ‘ 쒋은 것이닀.

01. pairλ₯Ό μ‚¬μš©ν•΄ μ„œλ₯˜μ‹¬μ‚¬ μˆœμœ„μ™€ λ©΄μ ‘ μˆœμœ„λ₯Ό 같이 λ°›λŠ”λ‹€

02. sortλ₯Ό μ΄μš©ν•΄ μ„œλ₯˜μ‹¬μ‚¬ μˆœμœ„λŒ€λ‘œ μ •λ ¬ν•œλ‹€

sortλŠ” μΈμžκ°€ 두 개일 경우, μ•žμ— μžˆλŠ” 인자 λ¨Όμ € μ •λ ¬ν•œλ‹€.

03. λ©΄μ ‘ μˆœμœ„λ₯Ό μ²΄ν¬ν•˜λŠ” ν•¨μˆ˜λ₯Ό λ§Œλ“ λ‹€

- μ„œλ₯˜ 1등은 무쑰건 ν•©κ²©μ΄λΌλŠ” 것을 생각해야 ν•œλ‹€. (μ„œλ₯˜, λ©΄μ ‘ λͺ¨λ‘μ—μ„œ λ°€λ¦¬λŠ” 일은 μ—†μŒ - μ„œλ₯˜ 1λ“±μ΄λ‹ˆκΉŒ!)

-> 일단 ν•©κ²©μž(cnt) μˆ˜λŠ” 1λͺ…λΆ€ν„° μ‹œμž‘ν•œλ‹€

- μ„œλ₯˜ 1λ“±μ˜ λ©΄μ ‘ μˆœμœ„λ³΄λ‹€ λ†’μ•„μ•Ό ν•©κ²©ν•œλ‹€ (λ‚˜λ¨Έμ§€λŠ” 이미 μ„œλ₯˜μ—μ„œ λ°€λ ΈκΈ° λ•Œλ¬Έ)

-> 기쀀을 μ„œλ₯˜ 1λ“±μ˜ λ©΄μ ‘ μˆœμœ„(arr[0].second)둜 μž‘λŠ”λ‹€

- λ§Œμ•½ μ„œλ₯˜ 1λ“±μ˜ λ©΄μ ‘ μˆœμœ„λ³΄λ‹€ 높은 μˆœμœ„κ°€ 생기면 κ·Έ μ‚¬λžŒμ΄ 기쀀이 λœλ‹€. 

 

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

vector<pair<int, int>> arr;

// λ©΄μ ‘ μˆœμœ„ 체크
int solution(int n){
  // μ„œλ₯˜ 1등은 무쑰건 합격
  // μ„œλ₯˜ 1λ“±μ˜ λ©΄μ ‘ μˆœμœ„λ³΄λ‹€ λ†’μ•„μ•Ό 합격
  int cnt = 1;
  int standard = arr[0].second;
  for (int i=1; i<n; i++){
    if (arr[i].second < standard){
      standard = arr[i].second;
      cnt++;
    }
  }
  return cnt;
}

int main(){
  int t, n;
  cin >> t;

  for (int i=0; i<t; i++){
    cin >> n;
    arr.assign(n, {0, 0});

    for (int j=0; j<n; j++){
      cin >> arr[j].first >> arr[j].second;
    }

    // μ„œλ₯˜ μˆœμœ„λŒ€λ‘œ μ •λ ¬
    sort(arr.begin(), arr.end());

    cout << solution(n) << "\n";
  }
}

λŒ“κΈ€