728x90
반응형
N은 과제의 개수
D는 과제 소요일, T는 과제 마감일이며 D, T 형태로 주어진다.
최대한 과제를 미루고 미루다가 마지막에 한번에 몰아서 하는데, 이 때 첫 과제를 시작하기 전 최대 며칠을 놀 수 있는지를 구하는 문제이다.
먼저 과제 마감일 기준으로 내림차순 정렬을 해줘야 한다. 그리고 day 변수에 가장 긴 마감일을 설정해 둔다. day는 놀 수 있는 날을 저장해둘 변수이며, 반복문이 진행되며 계속해서 갱신된다.
그리고 N번 반복문을 돌리되, day와 e(현재 과제의 마감일)중 더 작은 값에서 s(현재 과제의 소요일)을 뺀다.
그 뺀 값을 다시 day에 할당한다.
day가 길어도 과제의 마감일이 더 이르다면 마감일에서 s를 빼고,
마감일이 길어도 현재 남은 day가 더 짧다면 day에서 s를 뺀다.
이걸 반복하면 최종적으로 연속 며칠을 놀 수 있는지를 구할 수 있다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.util.Comparator;
import java.util.Arrays;
public class 내일_할거야_7983 {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
// N 입력받기
int N = Integer.parseInt(br.readLine());
// 소요일, 마감일 입력받기
int DT[][] = new int[N][2];
for(int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
for(int j = 0; j < 2; j++) {
DT[i][j] = Integer.parseInt(st.nextToken());
}
}
// 마감일 기준 내림차순 정렬
Arrays.sort(DT, Comparator.comparingInt((int[] a) -> a[1]).reversed());
// 쉴 수 있는 시간을 계산할 변수
// 초기값은 과제 중 가장 긴 마감일
int day = DT[0][1];
// 소요일, 마감일 저장할 변수
int s;
int e;
// day와 마감일 중 작은 시간에서 소요일을 뺀다.
// 둘 중 더 큰 값은 의미가 없어지기 때문
// day가 길어도 마감일이 짧으면 마감일에 맞춰야 한다.
// 과제의 마감일이 길어도 정작 남은 day가 짧으면 day에 맞춰야 한다. ( 앞서 계산된 특정 과제가 오랜 기간이 걸렸을 경우 이럴 수 있다 )
for(int i = 0; i < N; i++) {
// 현재 과제의 소요일, 마감일
s = DT[i][0];
e = DT[i][1];
// day와 e 중 작은 값에서 소요일을 빼 준다
day = Math.min(day, e) - s;
}
// 결과 출력
System.out.println(day);
br.close();
}
}
728x90
반응형
'Algorithm > Greedy' 카테고리의 다른 글
[Baekjoon 2138 / Python / 골드4] 전구와 스위치 (2) | 2024.09.26 |
---|---|
[Baekjoon 1911 / Python / 골드5] 흙길 보수하기 (0) | 2024.08.19 |
[Baekjoon 1026 / Java / 실버4] 보물 (0) | 2024.05.03 |
[Baekjoon 1931 / python / 실버1] 회의실 배정 (0) | 2024.04.06 |
[Baekjoon 1541 / python / 실버2] 잃어버린 괄호 (0) | 2024.04.05 |