개발자 피터
Peter's Dev Blog
개발자 피터
전체 방문자
오늘
어제
  • 분류 전체보기 (77)
    • 🧑🏻‍💻 Develop (13)
      • Devops (3)
      • Elasticsearch (3)
      • Design Pattern (1)
      • SQL (4)
      • Architecture (1)
      • APM (1)
    • 💻 Service (7)
      • E-ROOM (3)
      • Briefing (4)
    • 💡 Problem Solving (43)
      • Baekjoon (40)
      • Programmers (2)
    • 📚 Reading (12)
      • Tech (9)
      • Self-Help (3)
    • 💬 Etc (1)
    • 📈 Retrospective (1)

블로그 메뉴

  • 🌟 깃허브
  • 🏷️ 태그 클라우드
  • 📝 방명록

공지사항

인기 글

태그

  • 백트래킹
  • 브루트포스
  • 백준
  • 독서
  • elasticsearch
  • SQL
  • E-ROOM
  • 구현
  • boj
  • 문자열
  • MySQL
  • 그리디
  • java
  • Programmers
  • briefing

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
개발자 피터

Peter's Dev Blog

💡 Problem Solving/Baekjoon

[백준 - 1946] 신입 사원 [C++]

2023. 10. 22. 13:41
728x90
반응형

1. 문제

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

 

1946번: 신입 사원

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

www.acmicpc.net

 

2. 풀이

그리디 문제이다.

일단 n이 10만이므로 O(n^2) 으로는 풀 수 없다.

그래서 우선 서류순으로 정렬하고, 

1번째 지원자는 서류로 1등이니 반드시 뽑힌다.

2번째 지원자부터는 면접순위를 비교하면서 세줬다.

어떤 지원자가 서류점수는 낮더라도(정렬되어있으니 당연히 낮음) 현재까지의 최고 면접 순위보다 높은경우 

그 지원자를 선발하고 key를 교체한다.

 

3. 코드

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;
int T;
int n;

class Applicant {
public:
    int documentRank;
    int interviewRank;
    Applicant() {}
    Applicant(int d, int i) : documentRank(d), interviewRank(i) {}
};

bool compare(const Applicant& a, const Applicant& b) {
    return a.documentRank < b.documentRank;
}

int main() {
    cin.tie(nullptr);
    ios::sync_with_stdio(false);

    cin >> T;
    for(int t = 0; t < T; t++) {
        cin >> n;
        vector<Applicant> applicantList(n);
     
        for(int i = 0; i < n; i++) {
            int d, in;
            cin >> d >> in;
            applicantList[i] = Applicant(d, in);
        } 

        sort(applicantList.begin(), applicantList.end(), compare);

        int ans = 1;  // 첫 번째 지원자는 반드시 선발됩니다.
        int key = applicantList[0].interviewRank;  // 첫 번째 지원자의 면접 순위를 key로 설정

        for(int i = 1; i < n; i++) {
            if(applicantList[i].interviewRank < key) {
                ans++;
                key = applicantList[i].interviewRank;  // key 갱신
            }
        }

        cout << ans << "\n";
    }

    return 0;
}
728x90
반응형
저작자표시 (새창열림)

'💡 Problem Solving > Baekjoon' 카테고리의 다른 글

[백준 - 4179] 불! [C++]  (1) 2023.10.25
[백준 - 6593] 상범 빌딩 [C++]  (0) 2023.10.24
[백준 - 4358] 생태학 [C++]  (0) 2023.10.22
[백준 - 20055] 컨베이어 벨트 위의 로봇 [C++]  (0) 2023.10.20
[백준 - 1197] 최소 스패닝 트리 [C++]  (0) 2023.10.20
    '💡 Problem Solving/Baekjoon' 카테고리의 다른 글
    • [백준 - 4179] 불! [C++]
    • [백준 - 6593] 상범 빌딩 [C++]
    • [백준 - 4358] 생태학 [C++]
    • [백준 - 20055] 컨베이어 벨트 위의 로봇 [C++]
    개발자 피터
    개발자 피터
    Backend Engineer 🔥

    티스토리툴바