본문 바로가기

알고리즘/BOJ

11000번

11000번 - 강의실 배정


처음에 우선순위큐를 쓰는게 좋다는 생각이 들었고, sort 를 하고 시간변수를 선언하는 로직으로 풀면 될 것이라고 생각했다.


그래서 처음에 while문과 for문을 쓰고 time 이란 변수를 1씩 증가시키면서 모든 시간을 체크했는데,


문제에서 시간 제한이 10^9이므로 당연히 시간초과가 발생했다.


그러고 나서는 시간을 1씩 증가시키지 않고, 가장 빨리 시작하는 강의로 넘어가면서 했는데도 시간초과가 발생했다.


while 문과 for문을 써서 시간초과가 발생할 수 밖에 없는 구조였다.


한참을 고민하닥 갓들의 코드를 참고했다...


하지만 생각해보면 while문을 쓰는 이유가, 시간을 앞에서 부터 오름차순으로 증가시키기 위함이었다.


그런데 이미 나는 sort 를 해놓았기 때문에, 따로 while문을 통해서 시간을 증가시킬 필요가 없었다.


그냥 주어진 오름차순된 우선순위큐 값을 이용해서 시간을 넘어가기만 하면 되기 때문이었다.


그러다 보니 while문을 뺀 for문을 이용해서도 문제를 풀 수 있다는 사실을 알게 되었다.


풀고보니 내가 맞은순위에서 2등으로 체크! 처음으로 이런일이!


<정답 코드>


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
35
36
37
38
39
40
41
42
43
44
#include<iostream>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
 
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    int n, ans = 0;
    cin >> n;
    vector<pair<intint>> v;
    while (n--)
    {
        int s, e;
        cin >> s >> e;
        v.push_back({ s,e });
    }
    sort(v.begin(), v.end());
 
    priority_queue<int> q;
 
    q.push(-1);
 
    for (int i = 0; i < v.size(); i++)
    {
        if (v[i].first < -q.top())
        {
            q.push(-v[i].second);
        }
        else
        {
            q.pop();
            q.push(-v[i].second);
        }
 
        int size = q.size();
        ans = max(ans, size);
    }
 
    cout << ans << endl;
    return 0;
}
cs


반응형

'알고리즘 > BOJ' 카테고리의 다른 글

1316번  (0) 2018.02.15
1327번  (0) 2018.02.15
1152번  (0) 2018.02.12
3671번  (0) 2018.02.07
3407번  (0) 2018.02.07