본문 바로가기
Programando/Algorithm

탐욕 알고리즘(Greedy Algorithm)

Algorithm : 탐욕 알고리즘(Greedy Algorithm)

: 미리 정한 기준에 따라서 매번 가장 좋아보이는 답을 선택하는 알고리즘으로, 미래를 생각하지 않고 각 단계에서 가장 최선의 선택을 하는 기법이다. 각 단계에서 최선의 선택이 전체적으로도 최선이길 바라는 알고리즘

 

탐욕 알고리즘의 예시

활동 선택 문제(Activity Selection problem)

한 사람이 하나의 활동에 대해서만 작업할 수 있을 때 최대한 많은 활동을 할 수 있는 수를 선택하는 문제로 하나의 활동을 선택하면 나머지 겹치지 않는 활동에 대해서 독립적이다.

 

활동 선택 문제 코드

출처 : 1931번: 회의실 배정 (acmicpc.net)

 

1931번: 회의실 배정

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

www.acmicpc.net

 

import java.util.StringTokenizer;
import java.util.Arrays;
import java.util.Comparator;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class Main {
	public static void main(String[] args) throws IOException {
	    
	    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	    
	    int n = Integer.parseInt(br.readLine());
	    int[][] meetingroom = new int[n][2];
        
        StringTokenizer st;
	    
	    for(int i = 0; i < n; i++) {
	        
	        st = new StringTokenizer(br.readLine(), " ");
	        meetingroom[i][0] = Integer.parseInt(st.nextToken());
	        meetingroom[i][1] = Integer.parseInt(st.nextToken());
	        
	    }
	    
	    Arrays.sort(meetingroom, new Comparator<> () {
	    	@Override
	    	public int compare(int[] a1, int[] a2) {
	    		if(a1[1] == a2[1]) { // 끝나는 시간이 같으면
	    			return a1[0] - a2[0]; // 시작이 빠른 순서로
	    		}
	    		return a1[1] - a2[1]; // 그 외에는 끝나는 시간이 빠른 순서대로 정렬
	    	}
	    });
	    
	    int count = 0;
	    int prev_end_time = 0;
	    
	    for (int i = 0; i < n; i++) {
	    	// 이전 회의의 종료 시간이 i번째 회의의 시작 시간보다 빠르면
	    	if(prev_end_time <= meetingroom[i][0]) {
	    		prev_end_time = meetingroom[i][1];
                count++;
                // 이 회의를 넣고, prev_end_time을 i번째 회의의 종료 시간으로 갱신
	    	}
	    	
	    }
	    	
	    System.out.println(count);
	    
	}
}
 

[백준] 1931번 : 회의실배정 - JAVA [자바]

www.acmicpc.net/problem/1931 1931번: 회의실배정 (1,4), (5,7), (8,11), (12,14) 를 이용할 수 있다. www.acmicpc.net 문제 그리디 알고리즘의 대표적인 문제 중 하나다. 알고리즘 [접근 방법] 위와 같이 시간..

st-lab.tistory.com

 

분할 가능 배낭 문제(Fractional Knapsack Problem)

한 가방에 넣을 수 있는 무게의 최대 값이 정해져 있을 때, 일정한 가치와 무게가 있는 물건들을 가치의 합이 최대가 되도록 가방에 넣는 방법을 찾는 문제이다. 물건을 쪼갤 수 있다는 가정 하에서는 무게 대비 가치가 높은 것들을 먼저 넣는 게 좋다.

 


 

탐욕 알고리즘 참고 사이트

반응형

'Programando > Algorithm' 카테고리의 다른 글

정렬: 좌표 압축  (0) 2021.05.29
정렬: Comparator  (0) 2021.05.27
정렬: Comparable  (0) 2021.05.26
JAVA 해시맵 사용과 정렬 알고리즘  (0) 2021.05.25
정렬: 병합 정렬 알고리즘  (0) 2021.05.24