πŸ’»

[λ°±μ€€] 그리디 - 1946. μ‹ μž…μ‚¬μ› λ³Έλ¬Έ

μ•Œκ³ λ¦¬μ¦˜/λ¬Έμ œν’€μ΄ Baekjoon

[λ°±μ€€] 그리디 - 1946. μ‹ μž…μ‚¬μ›

λ˜νš¨λ‹ˆ 2020. 10. 1. 16:55

www.acmicpc.net/problem/1946

 

1946번: μ‹ μž… 사원

첫째 μ€„μ—λŠ” ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ˜ 개수 T(1 ≤ T ≤ 20)κ°€ 주어진닀. 각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ˜ 첫째 쀄에 μ§€μ›μžμ˜ 숫자 N(1 ≤ N ≤ 100,000)이 주어진닀. λ‘˜μ§Έ 쀄뢀터 N개 μ€„μ—λŠ” 각각의 μ§€μ›μžμ˜ μ„œλ₯˜μ‹¬μ‚¬ μ„±οΏ½οΏ½

www.acmicpc.net

문제

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

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

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

μž…λ ₯

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

좜λ ₯

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

예제 μž…λ ₯ 1

2

5

3 2

1 4

4 1

2 3

5 5

7

3 6

7 3

4 2

1 4

5 7

2 5

6 1

예제 좜λ ₯ 1

4 3

 

 


생각

- 성적, λ©΄μ ‘ λ“±μˆ˜λ₯Ό ν•˜λ‚˜ν•˜λ‚˜ for문을 μ‚¬μš©ν•΄ λΉ„κ΅ν•œλ‹€λ©΄ λŒ€λž΅ 100,000 X 100,000 X 2 X 20 의 μ‹œκ°„ λ³΅μž‘λ„λ₯Ό κ°€μ§€λ―€λ‘œ λΈŒλ£¨νŠΈν¬μŠ€λ‘œλŠ” 해결이 되질 μ•ŠλŠ”λ‹€.

μ„œλ₯˜ 심사 결과와 λ©΄μ ‘ 성적이 λͺ¨λ‘ 떨어지면 μ•ˆλ˜λŠ” κ²ƒμ΄λ―€λ‘œ, 일단 μ„œλ₯˜ λ“±μˆ˜λ‘œ 정렬을 ν–ˆλ‹€. 

- μ²˜μŒμ—λŠ” map을 μ΄μš©ν•˜λ©΄ key값을 κΈ°μ€€μœΌλ‘œ μžλ™μ •λ ¬μ΄ λ˜λ‹ˆκΉ μ‚¬μš©ν•˜λ €κ³  ν–ˆλŠ”λ°, 인덱슀둜 μ ‘κ·Όν•˜κΈ° μ‰¬μš΄ vectorλ₯Ό μ‚¬μš©ν–ˆλ‹€.

- ν…ŒμŠ€νŠΈμΌ€μ΄μŠ€κ°€ μ—¬λŸ¬κ°œμ΄λ―€λ‘œ μ΄ˆκΈ°ν™”μ— 신경을 μ¨μ€˜μ•Όν–ˆλ‹€. answer 값을 좜λ ₯ν•˜κ³  vector.clear() ν–ˆλ‹€.

 

μ½”λ“œ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
//1946. μ‹ μž…사원
#include <iostream>
#include <vector>
#include <algorithm>
 
using namespace std;
 
vector<pair<intint> > v;
int T, N;
int main(){
    cin >> T;
    for(int t=0; t<T; t++){
        cin >> N;
        for(int i=0; i<N; i++){
            int a, b;
            cin >> a >> b;
            v.push_back(make_pair(a, b));
        }
        sort(v.begin(), v.end());
 
        int answer = 1;
        int rank = v.front().second;
        for(int i=1; i<N; i++){
            if(v[i].second < rank) {
                answer ++;
                rank = v[i].second;
            }
        }
        cout << answer << "\n";
        v.clear();
    }
    return 0;
}
 
cs

 

 

λ°˜μ‘ν˜•
Comments