ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Greedy
    Algorithm/이론 2019. 10. 3. 00:45

    그리디 알고리즘은 탐욕 알고리즘 또는 욕심쟁이 알고리즘이라고 불린다.

    미래를 생각하지 않고 근시안적으로 각 단계에서 가장 최선의 선택을 하는 기법. 

     

    알고리즘

    1. 해 선택(Selection Procedure) : 지금 당시에 가장 최적인 해를 구한뒤, 이를 부분해 집합에 추가한다.

    2. 적절성 검사(Feasibility Check): 새로운 부분해 집합이 적절한지 검사한다.

    3. 해 검사(Solution Check) : 새로운 부분해 집합이 문제의 해가 되는지 검사한다. 아직 문제의 해가 완성되지 않았다면 1번 부터 다시 시작한다. 

     

    그리디 알고리즘이 통하는 몇몇 문제들이 있다.

     

    활동선택 문제

    활동 선택 문제는 쉽게 말해 한 강의실에서 여러 개의 수업을 하려고 할 때 한 번에 가장 많은 수업을 할 수 있는 경우를 고르는 것이다.

     

    직관적으로 생각했을 때, 최적의 해를 구하기 위해서는 첫번째 활동이 최대한 일찍 끝나면 된다. 그래야 다른 활동들을 더 많이 선택할 수 있기 때문!!

     

    1. 해 선택 : 가장 빨리 끝나는 활동을 부분해 집합에 추가한다.

    2. 적절성 검사 : 부분해 집합에서 겹치는 활동시간이 있는지 검사. 활동 시간이 겹친다면 최근에 추가한 활동을 삭제하고, 다시 1번으로 돌아가 그 다음으로 빨리 끝나는 활동을 부분해 집합에 추가한다.

    3 해 검사 : 모든 경우를 활동시간을 탐색하고 검사를 끝낸다.

     

     

    소스코드

    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
    public class Greedy {
        public class Task implements Comparable<Task> {
            int num;
            int start;
            int end;
     
            public Task(int num, int start, int end) {
                this.num = num;
                this.start = start;
                this.end = end;
            }
     
            @Override
            public int compareTo(Task o) {
                return this.end - o.end;
            }
     
        }
     
        public int[] go(int[][] arrays) {
            int[] answer = {};
     
            LinkedList<Task> list = new LinkedList<>();
            LinkedList<Task> result = new LinkedList<>();
            for (int i = 0; i < arrays.length; i++) {
                list.add(new Task(i + 1, arrays[i][1], arrays[i][2]));
            }
     
            // 끝나는 시간이 짧은 순으로 정렬
            Collections.sort(list);
     
            // 1. 해 선택 - 가장 빨리 끝나는 활동을 부분해 집합에 추가
            result.add(list.getFirst());
            int last = list.getFirst().end;
            for (int i = 1; i < list.size(); i++) {
            // 2. 적절성 검사 - 시간이 겹치지 않는 것 집합에 추가
                if (list.get(i).start > last) {
                    last = list.get(i).end;
                    result.add(list.get(i));
                }
            }
     
            for (Task t : result) {
                System.out.print(t.num + " ");
            }
            return answer;
        }
    }
    http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
    http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs
     

    'Algorithm > 이론' 카테고리의 다른 글

    이분 탐색 (Binary Search)  (0) 2020.04.24
    누적합(Cumulative sum) 2  (0) 2020.04.14
    누적합(Cumulative sum)  (0) 2020.04.14
    Merge Sort (합병 정렬)  (0) 2020.03.30
    BFS와 DFS  (0) 2019.10.06

    댓글

Designed by Tistory.