inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비

3. 결혼식

안녕하세요. 우선순위 큐를 활용해서 문제를 풀어봤는데 시간 초과가 발생 합니다 ㅠ

137

임인혁

작성한 질문수 5

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);
    }
}

java 코딩-테스트

답변 2

1

김태원

안녕하세요^^

정렬을 한 후 O(n)으로 처리하는게 좋습니다. 정렬을 하므로 전체 시간복잡도는 O(nlogn)입니다.

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다. 임인혁님!

우선 우선순위 큐를 이용한 문제 풀이 접근 방식에 대해 설명드리겠습니다. 이 문제는 크게 빅오 표기법 O(n log n)의 복잡도로 해결할 수 있습니다. 주어진 문제에서 노드(인물)들이 도착하고 떠나는 시간을 관리하면서 최대 겹치는 인원 수를 찾으려는 것 같습니다.

문제를 해결하기 위해서는 다음의 중요한 아이디어를 떠올려야 합니다:

  1. 우선순위 큐(Priority Queue): 이 자료구조는 자연스럽게 최소 혹은 최대 값을 빠르게 검색할 수 있기 때문에, 논리적으로 Priority Queue를 통해 도착 이후 가장 먼저 나가야 할 사람부터 검토하여 최대 겹치는 수를 찾는 것이 적절합니다.

  2. 정렬: 시작 시간을 기준으로 인원들을 정렬한 뒤, 도착 시간과 떠나는 시간 간의 관계를 이용하여 Priority Queue에서 적절하게 인원을 추가하고 제거합니다.

마지막으로, 임인혁님께서 작성한 코드에서 해결해야 할 부분은 가장 중요한 “도착 시간보다 먼저 떠나지 못하는 사람을 처리하는 로직”입니다. 코멘트에서 하신 말씀처럼 O(n log n) 시간 복잡도로 문제를 해결하셔야 합니다. 이는 기본적으로 Arrays.sort()PriorityQueue의 삽입 및 삭제 동작에서의 효율성으로 달성할 수 있습니다.

유사한 질문과 답변을 찾았는데, 이는 각 우선순위 큐 관련 질문을 해결하거나 이해하는 데 도움이 될 수 있습니다:
- 결혼식 문제 Queue로 풀어봤습니다. - 우선순위 큐를 어떻게 효과적으로 사용할 수 있는지에 대한 예시입니다.
- 해당 문제 다른 풀이에 대한 질문입니다. - 비슷한 문제 상황의 다른 풀이 방법에 대해 이야기가 나옵니다.
- 9-3. 결혼식 질문있습니다. - 정렬과 우선순위 큐를 실제로 구현하면서 겪는 문제 상황에 대한 설명입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

안녕하세요. 바뀐 채점사이트 관련해서 문의드립니다.

0

32

1

갑자기 채점 사이트가 바뀌었어요

0

33

1

문제 리스트 페이지

0

29

1

채점 사이트 관련 질문드립니다

0

24

1

봉우리 문제 질문입니다

0

83

2

씨름 선수 문제에서 각 선수의 몸무게나 키가 같을 수도 있다면?

0

65

0

이 코드랑 영상 코드중에 뭐가 더 좋은 코드인가요?

0

72

0

가중치 방향 그래프에서 가중치가 0인 간선을 표현하는 방법

0

67

1

좌표 정렬 문제 이 코드가 왜 틀린지 모르겠습니다 ㅠㅠ

0

85

2

6-7 강의에서

0

48

1

6-6. 장난꾸러기 질문 있습니다.

0

45

1

강의 수강후 코딩테스트

0

111

1

answer 변수 사용 여부

0

46

1

2중 for문

1

85

2

2-11. 임시반장정하기 (Runtime Error)

0

63

1

혹시 LinkedList 같은 자료 구조들은 따로 배우지 않나요?

0

70

1

이런 풀이는 어떨까요

0

44

1

자바 스트림 방식의 효율성 질문 드립니다.

0

57

1

알고리즘 자료 구조들..

0

63

1

StringBuilder vs BufferdWriter

0

48

1

원더랜드(프림)

0

50

1

이런 코드는 어떤가요?

0

61

1

bfs 풀이

0

57

1

병합정렬

0

57

1