ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준-1931]-[그리디알고리즘]-회의실배정
    알고리즘/그리디알고리즘(Greedy Algorithm) 2018. 11. 15. 17:09

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


    이문제를 풀때 가장 햇갈리는 부분은 시작시간과 종료시간의 기준이라고 생각한다. 


    시작시간으로만 배정 하게 되면 아래와 같은 제약 사항이 발생한다.



     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     1

     


    시작시간을 기준으로 시작시간이 2인 회의를 배정 하게되면 하나의 회의만 가능하다.


    또 회의시간이 짧은것으로 배정을 하게 되면 아래와 같은 제약 사항이 발생한다.



     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     1

     



    회의시간이 짧은것으로만 배정을 하게 되면 또다시 하나만 선택 되게 된다.


    이렇게 반례가 나오게 되면 그리디 알고리즘을 풀 수가 없다. 


    이 문제를 푸는 방법은 종료시간을 오름차순으로 정렬하게 되면 쉽게 풀수가 있다.


    11
    1 4
    3 5
    0 6
    5 7
    3 8
    5 9
    6 10
    8 11
    8 12
    2 13
    12 14

    예제 입력을 보게 되면 끝나는 시간의 오름차순으로 나와 있는걸 알 수 가 있다.

    아마 이문제를 푸는 방식을 이해할 수 있게 의도적으로 예제 입력을 저렇게 제공해준거 같다.

    추가로 회의시간의 정렬을 끝나는 시간의 오름차순 , 끝나는 시간이 같다면 시작하는 시간의 오름차순으로 정렬하면 된다.


    입력된 회의 시간을 모두 정렬을 했다 치고  배열의 0번째 인덱스에서 차례대로 조건에 해당되는 회의의 수를 파악하면 끝난다.


    조건 : 이전 회의의 끝나는 시간과 현재 회의의 시작 시간이 같거나 커야 한다. 


    소스


    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
     
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.StringTokenizer;
     
    public class B_1931 {
     
        public static void main(String[] args) throws IOException {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            StringTokenizer st = new StringTokenizer(br.readLine());
            
            int cnt = Integer.parseInt(st.nextToken());
            
            ArrayList<Time> timeList = new ArrayList<Time>();
            for(int i=0; i < cnt; i++) {
                st = new StringTokenizer(br.readLine());
                int start = Integer.parseInt(st.nextToken());
                int end = Integer.parseInt(st.nextToken());
                timeList.add(new Time(start, end));
            }
            
            Collections.sort(timeList);
            int result = 0;
            int prevEnd = 0;
            for(Time t:timeList) {
                if(prevEnd <= t.getStart()) {
                        result += 1;
                        prevEnd = t.getEnd();
                }
            }
            System.out.println(result);
        }
    }
     
    class Time implements Comparable<Time>{
        private int start;
        private int end;
        
        public Time(int start, int end) {
            this.start = start;
            this.end = end;
        }
        
        public int getStart() {
            return this.start;
        }
        
        public int getEnd() {
            return this.end;
        }
        @Override
        public int compareTo(Time t) {
            if(this.end < t.getEnd()) {
                return -1;
            }else if(this.end == t.getEnd()) {
                if(this.start < t.getStart()) {
                    return -1;
                }else if(this.start == t.getStart()) {
                    return 0;
                }else {
                    return 1;
                }
            }else {
                return 1;
            }
        }
        
        public String toString() {
            return "start : " + this.start + " end : " + this.end;
        }
    }
    cs


    댓글

Designed by Tistory.