강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

youngyou1324님의 프로필 이미지
youngyou1324

작성한 질문수

자바 코딩테스트 - it 대기업 유제

6. "가장 많이 사용된 회의실" 코드 해설

가장 많이 사용된 회의실

작성

·

84

·

수정됨

0

안녕하세요 강사님 강의 잘 듣고 있습니다

 

강사님 코드를 보면서 드는 의문이 굳이

while문이 필요한 가 입니다.

while문에 없어도 어쩌피 if else로직만으로도 잘 답을 가져오는 거 같아서요

혹시 예외 케이스가 있나요?

 


```java

package org.youyk.inflearn.latest.sec03.Problem6;

import java.util.*;
class Solution7 {
    public int solution(int n, int[][] meetings){
        int answer = 0;

        int[] rest = new int[n];
        // 끝나는 시간, 순번
        PriorityQueue<int[]> rooms = new PriorityQueue<>((a,b)->a[0] == b[0] ? a[1]-b[1] : a[0] - b[0]);
        TreeSet<Integer> roomSet = new TreeSet<>();

        for(int i=0;i<n;i++){
            roomSet.add(i);
        }
        Arrays.sort(meetings,(a,b)->a[0] - b[0]);

        for(int[] m : meetings){

            if(!roomSet.isEmpty()){
                int r = roomSet.pollFirst();
                rest[r]++;
                rooms.add(new int[]{m[1],r});
            }else{
                int[] poll= rooms.poll();
                rest[poll[1]]++;
                rooms.add(new int[]{poll[0] + (m[1] - m[0]), poll[1]});
            }
        }

        int max=0;
        for(int i=0;i<n;i++){
            if(max<rest[i]){
                max = rest[i];
                answer = i;
            }
        }

        return answer;
    }

    public static void main(String[] args){
        Solution7 T = new Solution7();
        System.out.println(T.solution(2, new int[][]{{0, 5}, {2, 7}, {4, 5}, {7, 10}, {9, 12}}));
        System.out.println(T.solution(3, new int[][]{{3, 9}, {1, 10}, {5, 8}, {10, 15}, {9, 14}, {12, 14}, {15, 20}}));
        System.out.println(T.solution(3, new int[][]{{1, 30}, {2, 15}, {3, 10}, {4, 12}, {6, 10}}));
        System.out.println(T.solution(4, new int[][]{{3, 20}, {1, 25}, {5, 8}, {10, 15}, {9, 14}, {12, 14}, {15, 20}}));
        System.out.println(T.solution(2, new int[][]{
                {0, 5}, {1, 2}, {2, 3}, {3, 6}, {6, 8}
        }));

    }
}

```

 

 

답변 2

0

김태원님의 프로필 이미지
김태원
지식공유자

안녕하세요^^

while 문이 빠지면

문제에서 2번 조건 :

"사용가능한 회의실이 여러개일 경우 가장 번호가 낮은 회의실에 회의를 배정해야 한다"

를 지키지 못하는 경우가 생깁니다.

아래 입력은 답이 0번 회의실이 답이 되는 예제입니다. 하지만 while문을 빼면 1를 출력합니다.

System.out.println(T.solution(2, new int[][]{{0, 9}, {2, 7}, {10, 12}}));

 

 

 

 

0

안녕하세요, 인프런 AI 인턴입니다.

Solution7 클래스의 코드를 살펴보면, 두 가지 주요 자료구조가 사용되고 있습니다. 첫 번째는 회의실 예약 상태를 추적하기 위한 PriorityQueue<int[]> rooms이고, 두 번째는 회의실 번호를 관리하는 TreeSet<Integer> roomSet입니다. 여기서 의문을 제기하신 while 문은 현재 코드 안에 존재하지 않습니다.

코드에서 rooms 우선순위 큐를 사용하여 회의가 끝나는 시간을 기준으로 가장 먼저 끝나는 회의(즉, 가장 빠르게 비어지는 회의실)를 제어하고 있으므로, 이 방식은 주어진 문제를 해결하는 데 가장 적합한 구조입니다. if-else 구조로도 동일한 결과를 도출할 수 있지만, PriorityQueue를 사용함으로써 회의실 관리의 효율성을 높일 수 있습니다.

단, 코드에서 rest[r]++의 의미는 각 회의실이 몇 번 사용되었는지를 저장하는 배열로, 회의실 사용 빈도의 최대값을 파악하여 가장 많이 사용된 회의실을 찾는 부분에서 활용됩니다. 따라서 PriorityQueueTreeSet 모두 필요한 요소라고 볼 수 있습니다.

다음 기존의 유사한 질문에 대한 답변들을 참고하실 수 있습니다:
- 시작시간을 기준으로 해도 답이 나오는데 괜찮나요?
- 최대수입스케줄 문제 j선언 차이

위 링크의 게시물에서는, 알고리즘 구성에 대한 논리적인 구조의 유효성 및 개선점이 상세히 설명되어 있으니, 참고하시면 도움이 될 것입니다.

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

youngyou1324님의 프로필 이미지
youngyou1324

작성한 질문수

질문하기