회의실 배정

문제 링크: https://www.acmicpc.net/problem/1931

 

1931번: 회의실 배정

(1,4), (5,7), (8,11), (12,14) 를 이용할 수 있다.

www.acmicpc.net

회의 시간을 모두 입력받고 정렬이 필요하다.
그 기준은 회의 시간의 시작과 끝인데, 회의 종료 시간이 빠르면 빠를수록 그 뒤에 오는 회의가 더 많아질 수 있다.
시작이 빠르다고 회의가 빨리 끝나는 것이 아니므로 정렬 기준은 회의 종료시간이라 할 수 있다.
그리고 회의의 수를 카운트하면 되는데, 회의가 진행하고 있는 중에 새로운 회의가 들어오면 안되므로 하나의 회의가 종료하기 전에 새 회의의 시작시간이 들어온다면 새 회의는 불가능 하다.
그래서 종료시간과 새 회의시간의 시작시간을 비교해서 종료시간보다 시작시간이 더 클 경우 카운트 해준다.

 

정렬하는데 있어 고려해야할 점이 있다.
회의 진행시간이 짧은 것이 더 많은 회의가 들어간다는 것이다.
회의 종료시점을 비교하는데 같은 시간대에 종료한다면, 회의 진행시간이 더 짧은 것이 더 많은 회의를 진행시킬 수 있다는 것이다.
회의 진행시간이 더 짧다는 것은 시작시간과 종료시간 간격이 더 짧다는 의미이며, 시작시간을 비교했을 때 더 늦게 시작한다는 뜻이다.

  • 정답 코드

      #include<iostream>
      #include<vector>
      #include<algorithm>
      using namespace std;
    
      bool compare(pair<int, int>* arr1, pair<int, int>* arr2) {
          if(arr1->second == arr2->second)
              return arr1->first < arr2->first;
          return arr1->second < arr2->second;
      }
    
      int main() {
          int n;
          cin >> n;
          vector<pair<int,int>*> list;
          while (n--) {
              pair<int, int>* pa = new pair<int, int>;
              cin >> pa->first >> pa->second;
              list.push_back(pa);
          }
          sort(list.begin(), list.end(),compare);
    
          int Count = 0;
          pair<int, int>* preList = list[0];
          Count++;
          for (int i = 1; i < list.size(); i++) {
              if (preList->second <= list[i]->first) {
                  Count++;
                  preList = list[i];
              }
          }
    
          cout << Count << endl;
          return 0;
      }

'ProblemSolving' 카테고리의 다른 글

[BOJ] 1149_RGB거리  (0) 2021.01.27
[BOJ] 19948_음유시인 영재  (0) 2021.01.26
[BOJ] 1012_유기농 배추  (0) 2021.01.24
[BOJ] 1105_팔  (0) 2021.01.23
[BOJ] 1024_수열의 합  (0) 2021.01.22
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기