작성
·
69
0
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
시간초과가 발생 했는데 무조건 빅오n 내에 끝내야 하는 문제 인가요??
아이디어는 가장 먼저 피로연에서 나가야하는 사람(스케쥴)을 큐(피로연)의 가장 앞에 두고 현재 도착한 사람(가장 최근 도착한 사람)의 도착 시간과 가장 먼저 나가야하는 사람의 출발 시간을 비교해서 큐에 있는 사람을 나가게 할지 남게 할지를 결정하도록 했습니다. 그런데 4번째 문제까지는 정답처리 되고 5번째 문제에서 시간 초과가 발생 하는데 혹시 n의 시간 복잡도로 풀어야 하는 문제인지 궁금해서 문의 드립니다!
import java.util.*;
public class Main {
static public class Schedule {
int arrive;
int departure;
public Schedule(int a, int d) {
this.arrive = a;
this.departure = d;
}
@Override
public String toString() {
return "Schedule{" +
"arrive=" + arrive +
", departure=" + departure +
'}';
}
}
public void solution(Schedule[] arr, int n) {
Arrays.sort(arr, Comparator.comparing((Schedule s) -> s.arrive).thenComparing((Schedule s) -> s.departure));
Queue<Schedule> pq = new PriorityQueue<>(Comparator.comparingInt(o -> o.departure));
int maxCount = 0;
for (int i = 0; i < n; i++) {
Schedule arrived = arr[i];
if (! pq.isEmpty()) {
Schedule remain = pq.peek();
if (arrived.arrive >= remain.departure) {
pq.poll();
}
}
pq.offer(arrived);
maxCount = Math.max(pq.size(), maxCount);
}
System.out.println(maxCount);
}
/*
5
5 15
12 13
14 18
15 20
20 30
*/
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
int n = in.nextInt();
Schedule[] input = new Schedule[n];
for (int i = 0; i < n; i++) {
input[i] = new Schedule(in.nextInt(), in.nextInt());
}
Main main = new Main();
// System.out.println(main.solution(n, m));
main.solution(input, n);
}
}
답변 2
1
0
안녕하세요, 인프런 AI 인턴입니다. 임인혁님!
우선 우선순위 큐를 이용한 문제 풀이 접근 방식에 대해 설명드리겠습니다. 이 문제는 크게 빅오 표기법 O(n log n)의 복잡도로 해결할 수 있습니다. 주어진 문제에서 노드(인물)들이 도착하고 떠나는 시간을 관리하면서 최대 겹치는 인원 수를 찾으려는 것 같습니다.
문제를 해결하기 위해서는 다음의 중요한 아이디어를 떠올려야 합니다:
우선순위 큐(Priority Queue): 이 자료구조는 자연스럽게 최소 혹은 최대 값을 빠르게 검색할 수 있기 때문에, 논리적으로 Priority Queue를 통해 도착 이후 가장 먼저 나가야 할 사람부터 검토하여 최대 겹치는 수를 찾는 것이 적절합니다.
정렬: 시작 시간을 기준으로 인원들을 정렬한 뒤, 도착 시간과 떠나는 시간 간의 관계를 이용하여 Priority Queue에서 적절하게 인원을 추가하고 제거합니다.
마지막으로, 임인혁님께서 작성한 코드에서 해결해야 할 부분은 가장 중요한 “도착 시간보다 먼저 떠나지 못하는 사람을 처리하는 로직”입니다. 코멘트에서 하신 말씀처럼 O(n log n)
시간 복잡도로 문제를 해결하셔야 합니다. 이는 기본적으로 Arrays.sort()
및 PriorityQueue
의 삽입 및 삭제 동작에서의 효율성으로 달성할 수 있습니다.
유사한 질문과 답변을 찾았는데, 이는 각 우선순위 큐 관련 질문을 해결하거나 이해하는 데 도움이 될 수 있습니다:
- 결혼식 문제 Queue로 풀어봤습니다. - 우선순위 큐를 어떻게 효과적으로 사용할 수 있는지에 대한 예시입니다.
- 해당 문제 다른 풀이에 대한 질문입니다. - 비슷한 문제 상황의 다른 풀이 방법에 대해 이야기가 나옵니다.
- 9-3. 결혼식 질문있습니다. - 정렬과 우선순위 큐를 실제로 구현하면서 겪는 문제 상황에 대한 설명입니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.