회의실배정 유형의 문제방법으로 접근했다.
다만 나는 하루 시간이 24시간이라고 생각하고 풀어서 오답이 나왔는데,
문제에서는 그런 조건이 없으므로하루 == 24시간
이라는 생각을 버리고 풀어야 한다.
import sys
input = sys.stdin.readline
n = int(input())
arr = []
for _ in range(n):
arr.append(tuple(map(int, input().split())))
arr.sort(reverse=True, key=lambda x: x[1])
time = 1000000
for t, s in arr:
time = min(s, time) - t
if time < 0:
time = -1
break
print(time)
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.Arrays;
import java.util.Comparator;
import java.util.StringTokenizer;
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());
Node[] arr = new Node[n];
for (int i =0; i < n; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
int t = Integer.parseInt(st.nextToken());
int s = Integer.parseInt(st.nextToken());
arr[i] = new Node(t, s);
}
Arrays.sort(arr, new Comparator<Node>() {
@Override
public int compare(Node n1, Node n2) {
return n2.s - n1.s;
}
});
int time = 1000000;
for (Node node : arr) {
time = Math.min(time, node.s) - node.t;
if (time < 0) {
time = -1;
break;
}
}
System.out.println(time);
}
static class Node {
int t;
int s;
public Node(int t, int s) {
this.t = t;
this.s = s;
}
}
}
주어지는 할 일들을 마감시간이 늦은 순서대로 정렬한다.
time
은 이전일이 끝나는 시간으로 생각한다.
(이전 일이란 시간상 이전을 의미하는것이 아닌 리스트상에서 이전 인덱스 값을 뜻한다.)
(처음에는 초기값을 24를 잡았지만 문제에서 하루가 24시간이라는 조건이 없었으므로 S
의 가장 큰 값인 '백만'을 초기값으로 잡는다.)
최대한 늦장을 부려야 함으로 될 수 있다면 마감시간에 맞춰 끝내는 걸 목표로 잡는다.
하지만 현재 시간이 time
보다 빠를 수 있다. 이때는 마감시간에 맞추는게 불가능 함으로 time
에 끝내는 걸 맞춰야한다. 이를 위해서 min(time, s)
를 사용했다.
시작시간은 0
시라고 하였으므로 계산 후에 time
값이 음수가 된다면 불가능한 일이 되버린다.