Leetcode Java The Number of the Smallest Unoccupied Chair
업데이트:
문제
코드
class Solution {
public int smallestChair(int[][] times, int targetFriend) {
int result = -1;
int start = times[targetFriend][0];
Arrays.sort(times, (x, y) -> x[0] - y[0]);
Queue<int[]> queue = new PriorityQueue<>((x, y) -> x[0] - y[0]);
Queue<Integer> chairs = new PriorityQueue<>();
for (int i = 0, j = 0; i < times.length; i++) {
while (!queue.isEmpty() && queue.peek()[0] <= times[i][0]) {
chairs.offer(queue.poll()[1]);
}
result = chairs.isEmpty() ? j++ : chairs.poll();
queue.offer(new int[] { times[i][1], result });
if (times[i][0] == start) {
break;
}
}
return result;
}
}
결과
설명
- n명의 친구가 times의 순서대로 의자에 앉았다 일어날 때, targetFriend 번째 친구가 앉는 의자의 번호를 반환하는 문제이다.
- times[i] = [arrivali, leavingi]를 의미하며, arrivali는 앉는 시간 leavingi는 떠나는 시간을 뜻한다.
- targetFriend와 의자의 번호는 0-index이다.
- 문제 풀이에 필요한 변수를 정의한다.
- result는 targetFriend 번째 친구가 앉는 의자의 번호를 저장할 변수로, -1로 초기화한다.
- start는 targetFriend 번째 친구가 앉기 시작하는 시간을 저장한 변수로, target[targetFriend][0]의 값으로 초기화한다.
- times는 의자에 앉는 시간 기준으로 오름차순 정렬한다.
- queue는 의자에서 떠나는 시간을 의자 번호와 같이 저장할 변수로, 떠나는 시간의 오름차순 정렬되는 PriorityQueue로 초기화한다.
- chairs는 앉아있는 의자를 저장할 변수로, 의자 순서대로 저장할 PriorityQueue로 초기화한다.
- times탐색을 위한 위치인 i는 0부터 times 길이 미만까지 증가시키며, chairs가 비어있을 때 의자 시작 위치를 저장할 j는 0으로 초기화하여 아래를 수행한다.
- queue가 비어있지 않으면서 queue의 첫 친구가 의자에 앉는 시간이 times[i]의 의자에 앉는 시간 이하일 때까지, chairs에 queue에서 해당 친구가 의자를 떠나는 시간을 넣어준다.
- result에 chairs가 비어있으면 다음 의자인 j를 넣고 j를 증가시켜주고, 비어있지 않으면 chairs에서 현재 앉을 수 있는 의자를 배정시켜준다.
- queue에 i번째 친구가 의자를 떠나는 시간인 times[i][1]와 의자 번호인 result를 넣어준다.
- times[i][0]인 i번째 친구가 의자를 앉는 시간이 targetFriend 번째 친구가 앉는 시간인 start인 경우, 반복을 중지한다.
- 위의 반복이 완료되면 의자의 번호가 저장된 result를 주어진 문제의 결과로 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기