본문 바로가기

프로그래머스(Java)/Level 2

[프로그래머스] 호텔 대실

728x90

코드 힌트

1. 예약 시간 변환

  • 입력으로 받은 예약 시간을 분 단위로 변환해요.
  • 종료 시간에는 10분의 추가 시간을 더해 방 정리 시간을 고려합니다.

2. 시간 정렬

  • 예약 시간을 시작 시간을 기준으로 오름차순 정렬하여 처리 순서를 쉽게 만듭니다.

3. 방 배정

  • 각 예약 시간을 기존의 방에 할당할 수 있는지 확인합니다.
  • 방이 겹치지 않으면 기존 방에 예약을 추가하고, 겹치면 새로운 방을 생성합니다.

4. 최종 결과

  • 모든 예약을 방에 할당한 후 필요한 방의 개수를 반환합니다.

 

 


정답은 더보기 클릭

더보기
import java.util.*;

class Solution implements Comparator<int[]> {
    
    // 주어진 예약 시간을 기준으로 필요한 방 개수를 계산하는 메소드
    public int solution(String[][] book_time) {
        List<List<int[]>> reservationList = new ArrayList<>();  // 방 리스트를 관리하는 배열
        int[][] bookTime = initBookTime(book_time);  // 예약 시간을 분 단위로 변환
        
        // 예약 시간을 정렬 (시작 시간 기준으로)
        Arrays.sort(bookTime, this);
        
        // 각 예약 시간을 방에 할당
        for (int[] arr : bookTime) {
            assignRoom(reservationList, arr);
        }
        
        return reservationList.size();  // 필요한 방 개수 반환
    }
    
    // 예약 시간을 [시작, 종료] 형태로 변환하고 종료 시간에 10분을 더함
    public int[][] initBookTime(String[][] book_time) {
        int[][] bookTime = new int[book_time.length][2];  // 예약 시간 배열 생성
        
        for (int i = 0; i < bookTime.length; i++) {
            for (int j = 0; j < 2; j++) {
                bookTime[i][j] = getMin(book_time[i][j]);  // 시간을 분 단위로 변환
                
                if (j == 1) bookTime[i][j] += 10;  // 종료 시간에 10분 추가 (방 정리 시간)
            }
        }
        
        return bookTime;
    }
    
    // Comparator 인터페이스를 구현하여 시작 시간을 기준으로 배열을 정렬하는 메소드
    @Override
    public int compare(int[] o1, int[] o2) {
        return Integer.compare(o1[0], o2[0]);
    }
    
    // 예약을 방에 할당하는 메소드, 적합한 방이 없으면 새로운 방 생성
    public void assignRoom(List<List<int[]>> reservationList, int[] arr) {
        // 이미 생성된 방들 중에서 확인
        for (List<int[]> compareList : reservationList) {
            boolean isAble = true;  // 방에 할당 가능한지 여부를 나타내는 플래그
            // 해당 방에 다른 예약과 시간이 겹치는지 확인
            for (int[] compareArr : compareList) {
                if (compareArr[0] < arr[1] && compareArr[1] > arr[0]) {
                    isAble = false;  // 시간이 겹치면 방에 추가 불가
                }
            }
            // 방에 추가 가능하면 해당 방에 예약 추가
            if (isAble) {
                compareList.add(arr);
                return;
            }
        }
        
        // 적합한 방이 없으면 새로운 방 생성
        List<int[]> list = new ArrayList<>();
        list.add(arr);
        reservationList.add(list);
    }
    
    // 시간을 분으로 변환하는 메소드 (시:분을 분 단위로 계산)
    public int getMin(String time) {
        int result = 0;
        
        String[] timeArr = time.split(":");
        result += Integer.parseInt(timeArr[1]);  // 분 계산
        result += Integer.parseInt(timeArr[0]) * 60;  // 시간을 분으로 변환
        
        return result;
    }
}
728x90