Greedy Algorithm



그리디 알고리즘이란 문제의 해를 구하는 데에 있어 매 순간에 최적의 값을 택하는 알고리즘이다.

모든 경우의 수를 전부 체크하지 않기 때문에 이 알고리즘을 통해 최적의 경우를 찾았다고 확신할 수는 없다.

따라서 이 알고리즘을 사용할 때에는 실제로 이 알고리즘이 전체 경우의 수를 고려했을 때에도

최적의 결과를 낼 수 있는지를 꼭 고려해 봐야 한다.



다음은 정올 1370번 문제인 회의실 배정(http://jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=645&sca=3020)의 풀이를 직접 작성한 것이다.

이 경우, 이전 회의가 끝나지 않으면 다음 회의가 진행될 수 없다는 제약 조건을 이용하여

모든 회의의 종료 시각을 기준으로 오름차순 정렬하고, for문을 이용해 모든 조건을 다 돌면서

다음 회의의 시작 시각이 현재 회의의 종료 시각보다 작은 경우에 값을 저장하고, 나머지는 무시해버리면 된다.

어차피 오름차순으로 정렬되어 있기 때문에 시작 시간이 같은 경우 가장 빨리 끝나는 회의가 가장 앞에 위치한다.



...라는 목적으로 작성한 코드인데, 왜인지 잘 작동하지 않는다.

내 컴퓨터에서는 정상적으로 작동하고 값도 잘 나오는데, 정올에 돌리니 Runtime Error가 나더라...

나중에 확실히 성공하게 되면 수정하도록 하겠다.


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
45
#include <iostream>
#include <vector>
#include <utility>
#include <algorithm>
 
using namespace std;
 
bool mySortASC(pair<intpair<intint>> i, pair<intpair<intint>> j) {
    return i.second.second < j.second.second;
}
 
int main(int argc, char *argv)
{
    vector<pair<intpair<intint>>> meet;
    vector<int> ret;
    int num, startHour, endHour, N;
    int minTime = 2147483647;
 
    cin >> N;
    for (int i = 0; i<N; i++) {
        cin >> num;
        cin >> startHour;
        cin >> endHour;
        meet.push_back(pair <intpair<intint>>(num, pair<intint>(startHour, endHour)));
    }
 
    sort(meet.begin(), meet.end(), mySortASC);
    ret.push_back(meet[0].first);
    endHour = meet[0].second.second;
    for (int i = 1; i < N; i++) {
        if (endHour <= meet[i].second.first) {
            endHour = meet[i].second.second;
            ret.push_back(meet[i].first);
        }
    }
    
    cout << ret.size() << endl;
    for (int i = 0; i < ret.size(); i++) {
        cout << ret[i] << " ";
    }
    cout << endl;
 
    system("pause");
    return 0;
}
cs


블로그 이미지

__미니__

E-mail : skyclad0x7b7@gmail.com 나와 계약해서 슈퍼 하-카가 되어 주지 않을래?

댓글을 달아 주세요