그리디 알고리즘

OneTwoThree·2023년 10월 3일

알고리즘

목록 보기
22/22

백준 1931 회의실 문제

회의실 문제

package codingtest;

import java.util.*;
import java.io.*;

public class Main{
	
	static long[][] arr;
	
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int N = Integer.parseInt(br.readLine());
		arr = new long[N][2];
		for (int i=0; i<N; i++) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			arr[i][0] = Long.parseLong(st.nextToken());
			arr[i][1] = Long.parseLong(st.nextToken());
		}
				
		Arrays.sort(arr, (arr1,arr2)->{
			if (arr1[1]==arr2[1]) {
				return (int)(arr1[0]-arr2[0]);
			}
			return (int)(arr1[1]-arr2[1]);
		});

		// 제일 빨리 끝나는 애를 고르고 
		// 남은 애들 중 또 제일 빨리 끝나느 애를 고르고 .. 
		
		long end = 0;
		int count = 0;
		
		for (int i=0; i<N; i++) {
			if (end<=arr[i][0]) {
				count+=1;
				end = arr[i][1];
			}
		}
		
		System.out.println(count);
		
	}
}

핵심은 회의가 끝나는 시간이 빠른 것부터 정렬하는 것이다.
그리고 앞에서 부터 선택하며 시작 시간이 선택된 회의의 시간보다 늦은 것 중 또 제일 빨리 끝나는 회의를 선택한다.
그리고 정렬할 때 끝나는 시간이 같은 경우는 더 빨리 시작하는 것으로 정렬되도록 해야 한다. 안 그러면 반례에 걸린다!

백준 1541 잃어버린 괄호

package codingtest;

import java.util.*;
import java.io.*;

public class Main{		
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		// - 기준으로 나눈다 
		String[] arr = br.readLine().split("\\-");
		
		int[] sum = new int[arr.length];
		
		for (int i=0; i<arr.length; i++) {
			String[] part = arr[i].split("\\+");
			if (part.length==1) {
				sum[i]=Integer.parseInt(part[0]);
			} else {
				for (int j=0; j<part.length; j++) {
					sum[i]+=Integer.parseInt(part[j]);
				}
			}
		}
		
		int result = sum[0];
		for (int i=1; i<sum.length; i++) {
			result -= sum[i];
		}
		
		System.out.println(result);
		
	}
}

값이 최소가 되기 위해서는 -를 기준으로 먼저 나누고 나눈 수끼리 더한 후 빼줘야 한다. 즉 가장 큰 값을 빼도록 해야 한다.
주의할 점은 split(\\-) 처럼 split 메서드에 특수기호를 사용할 때 앞에 \\를 붙여줘야 한다.

0개의 댓글