Algorithm/BOJ

[백준] #1946 신입사원

jHoon0223 2021. 9. 28. 15:18

https://www.acmicpc.net/problem/1946

 

1946번: 신입 사원

첫째 줄에는 테스트 케이스의 개수 T(1 ≤ T ≤ 20)가 주어진다. 각 테스트 케이스의 첫째 줄에 지원자의 숫자 N(1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개 줄에는 각각의 지원자의 서류심사 성

www.acmicpc.net

간단한 그리디 알고리즘 문제로, 조금만 다르게 생각해본다면 쉽게 풀 수 있는 문제다.


  • 풀이

가장 단순하게 브루트포스를 이용하여 모든 인덱스를 전수조사하는 방법도 있겠지만, 그렇게 될 경우 반복문 2개를 사용하게 되어 연산 횟수가 10B 가 된다. 따라서, 반복문 하나만으로 해결해야 하는 문제이다.

 

다음 특성만 생각하면 무척 쉬운 문제이다.

1. 지원자 중, 두 심사의 등수 모두 본인보다 높은 사람이 한명이라도 있다면, 탈락한다.
2. 두 심사중 하나만이라도 다른사람보다 등수가 높다면, 합격한다.
=> 어느 하나의 심사를 기준으로 정렬된 벡터에서 다른 한 심사의 최솟값을 갱신시키는 인덱스는 합격한다.

  • 구현
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main(void) {
    int T;
    cin >> T;

    while (T-->0) {
        int N, cnt = 1;
        cin >> N;

        vector<pair<int, int>> v;
        for (int i = 0; i < N; i++) {
            int a, b;
            cin >> a >> b;
            v.push_back(make_pair(a,b));
        }   //벡터 구성

        //브루트포스 방식으로 각 인덱스 전수조사 -> 시간 초과 발생. 연산 횟수 최대 10B
        /*for (int i = 0; i < v.size(); i++) {
            pair<int,int> target = v[i];

            for (int j = 0; j < v.size(); j++) {
                if (target.first > v[j].first && target.second > v[j].second) {
                    cnt++;
                    v.erase(v.begin() + i);
                    i--;
                    break;
                }
            }

        }
        cout << N-cnt << '\n';*/

        sort(v.begin(), v.end());

        int target = v[0].second;
        for (int i = 1; i < v.size(); i++) {
            if (target > v[i].second) {
                cnt++;
                target = v[i].second;
            }
        }
        cout << cnt << '\n';
    }

    return 0;
}

처음 시도에서 브루트포트 방식으로 풀다 시간초과, 두번째 시도에선 최솟값을 갱신시키지 않아서 틀렸다.

728x90

'Algorithm > BOJ' 카테고리의 다른 글

[BOJ] #18870 좌표 압축  (0) 2023.10.26
[백준] #1181 단어 정렬  (0) 2022.08.01
[백준] #16953 A → B  (0) 2021.08.23
[백준] #12904 A와 B  (0) 2021.08.22
[백준] #1918 후위 표기식  (0) 2021.08.22