작성
·
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]++
의 의미는 각 회의실이 몇 번 사용되었는지를 저장하는 배열로, 회의실 사용 빈도의 최대값을 파악하여 가장 많이 사용된 회의실을 찾는 부분에서 활용됩니다. 따라서 PriorityQueue
와 TreeSet
모두 필요한 요소라고 볼 수 있습니다.
다음 기존의 유사한 질문에 대한 답변들을 참고하실 수 있습니다:
- 시작시간을 기준으로 해도 답이 나오는데 괜찮나요?
- 최대수입스케줄 문제 j선언 차이
위 링크의 게시물에서는, 알고리즘 구성에 대한 논리적인 구조의 유효성 및 개선점이 상세히 설명되어 있으니, 참고하시면 도움이 될 것입니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.