프로그래머스 호텔 대실 자바

바그다드·2023년 3월 17일
0

알고리즘

목록 보기
3/14

문제


리뷰

내가 일단 생각해본 과정은 다음과 같다.
1. 각 string형 데이터를 ":"를 제외시키고 숫자형으로 만들기
2. 종료 시간에는 10분을 더하기(청소시간)
3. 각 숫자를 배열로 선언하여 0번째에는 시작 시간을 1번째에는 종료 시간을 저장하기
4. 배열을 정렬하기
5. 반복문을 이용하여 현재 예약의 종료 시간과 다음 예약의 시작 시간을 비교
	- 리스트를 활용할 생각이었음
	- 종료 <= 시작 이라면 해당 인덱스의 값을 새로운 시작 값으로 바꿈
    - 종료 > 시작 이라면 리스트에 새로운 칸을 하나 더함

여기서 내가 빼먹은건

1. 60분이 되면 1시간을 더하고 분은 초기화 해야한다는 것
- 시간을 제외한 분이 60이라면 +40을 해줌(ex - 1960 -> 2000)
2. 리스트로 처리할 경우 리스트 안에서 다시 반복문을 사용해야 한다는 점
- PriorityQueue를 사용하면 됨
- PriorityQueue는 트리 형태의 자료 구조로 작은 값이 맨 위에 위치함
- 따라서 따로 반복문을 돌리지 않아도 종료 시간이 가장 빠른 예약이 항상 맨 위에 위치하므로
맨 위의 값만 확인하면 됨

풀이

import java.util.*;

class Solution {
    public int solution(String[][] book_time) {
        int[][] arr = new int[book_time.length][book_time[0].length];
        for(int i = 0; i < book_time.length; i++){
            int start = Integer.parseInt(book_time[i][0].replace(":", ""));
            int end = Integer.parseInt(book_time[i][1].replace(":",""));
            
            end+=10;
            
            if(end % 100 >= 60){
                end+=40;
            }
            
            arr[i][0] = start;
            arr[i][1] = end;
        }
        Arrays.sort(arr, (a,b) ->{
            if(a[0]==b[0]){
                return a[1] - b[1];
            }
            return a[0] - b[0];
        });
        
        PriorityQueue<Integer> rooms = new PriorityQueue<>();
        
        
        for(int i = 0; i < arr.length; i++){
            if(rooms.size() == 0){
                rooms.add(arr[i][1]);
                continue;
            }
            
            if(arr[i][0] >= rooms.peek()){
                rooms.poll();
                rooms.add(arr[i][1]);
            }else{
                rooms.add(arr[i][1]);
            }
        }
        
        
        int answer = rooms.size();
        return answer;
    }
}
profile
꾸준히 하자!

0개의 댓글