[프로그래머스] Lv.2 호텔 대실 (Java)

2023. 7. 21. 10:18·Algorithms(CT)/Programmers

https://school.programmers.co.kr/learn/courses/30/lessons/155651

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 설명

호텔을 운영 중인 코니는 최소한의 객실만을 사용하여 예약 손님들을 받으려고 합니다.
한 번 사용한 객실은 퇴실 시간을 기준으로 10분간 청소를 하고 다음 손님들이 사용할 수 있습니다.
예약 시간이 문자열 형태로 담긴 2차원 배열 book_time이 매개 변수로 주어질 때, 코니에게 필요한 최소 객실의 수를 return 하는 solution함수를 완성해 주세요.


💡 아이디어

손님의 대실 시작시간이 현재 있는 객실 중에 이용 가능한 객실이 있으면 해당 객실에 배정하고, 만약 객실이 다 사용 중이라면 새로운 객실을 추가해 손님을 배정하도록 합니다.

 

📗 풀이 과정

 

예시 : [["15:00", "17:00"], ["16:40", "18:20"], ["14:20", "15:20"], ["14:10", "19:20"], ["18:20", "21:20"]]

 

1. 일단 대실 시작 시간이 빠른 순으로 book_time을 정렬해 줍니다. (객실을 먼저 온 사람에게 먼저 배정해야 하기 때문.)

[["14:10", "19:20"], ["14:20", "15:20"], ["15:00", "17:00"], ["16:40", "18:20"], ["18:20", "21:20"]]

 

2. 정렬된 book_time에서 손님 예약 정보를 하나씩 받아옵니다.

 

3. 해당 손님을 배정할 수 있는 객실을 찾습니다.

    객실이 저장되어 있는 ArrayList는 객실별 이용가능 시작시간을 넣어놓습니다.

4. 이용 가능한 객실이 없기 때문에, 새로운 객실을 생성하고 해당 손님을 예약해 손님의 퇴실시간+청소(10분)가 끝나는 시각을 분(minutes) 형식으로 바꿔 객실 list에 저장해 줍니다.

 

5. 만약 이용가능한 객실이 있다면 해당 객실 또한 4번처럼 현재 예약하려는 손님의 퇴실시간+10분의 시각으로 바꿔놓습니다.

 

6. 위의 작업을 book_time에 있는 예약한 손님들이 모두 예약을 마칠 때까지 반복했을 때, 만들어지는 객실 수가 최소한의 객실 수입니다.


전체 코드

import java.util.*;
class Solution {
    ArrayList<Integer> availTime = new ArrayList<>();//객실별 이용가능 시작시간
    public int solution(String[][] book_time) {
        int answer = 0;
        
        //예약시간이 빠른 순으로 book_time 정렬
        Arrays.sort(book_time, (s1,s2)->changeMins(s1[0])-changeMins(s2[0]));
        
        for(int i=0;i<book_time.length;i++){//예약 손님 받기
            //사용가능한 객실 번호 찾기
            int roomNum=-1;
            for(int j=0;j<availTime.size();j++){
                //손님 대실 시작 시간 >= j번째 객실 이용 가능한 시작 시간
                if(changeMins(book_time[i][0])>=availTime.get(j)){ roomNum=j;break; }     
            }
            
            //이용가능한 객실이 있으면, 이용이 끝나는시간+10분 청소가 끝나는 시간 넣어줍니다.
            if(roomNum>=0) availTime.set(roomNum,changeMins(book_time[i][1])+10);
            //이용할 수 있는 객실이 없다면 하나 추가하고 손님 받아서 넣음.
            else availTime.add(changeMins(book_time[i][1])+10);
        }
        for(int i:availTime) System.out.print(i+" ");
        
        
        return availTime.size();
    }
    // (String)시간 -> (int) 분
    int changeMins(String time){
        
        String[] t = time.split(":");
        
        return Integer.parseInt(t[0])*60+Integer.parseInt(t[1]);
    }
}

'Algorithms(CT) > Programmers' 카테고리의 다른 글

[프로그래머스] Lv.2 거리두기 확인하기 (Java)  (0) 2023.07.26
[프로그래머스] Lv.2 점 찍기 (Java)  (0) 2023.07.21
[프로그래머스]Lv.2 배달 (Java)  (0) 2023.07.20
[프로그래머스] Lv.2 행렬 테두리 회전하기 (Java)  (0) 2023.07.19
[프로그래머스] Lv.2 수식 최대화 (Java)  (0) 2023.07.18
'Algorithms(CT)/Programmers' 카테고리의 다른 글
  • [프로그래머스] Lv.2 거리두기 확인하기 (Java)
  • [프로그래머스] Lv.2 점 찍기 (Java)
  • [프로그래머스]Lv.2 배달 (Java)
  • [프로그래머스] Lv.2 행렬 테두리 회전하기 (Java)
gwee_99
gwee_99
bE bETTER!
  • gwee_99
    얼렁이와 뚱땅이
    gwee_99
  • 전체
    오늘
    어제
    • ====Category====
      • Algorithms(CT)
        • Programmers
        • Baekjoon
        • Goorm
      • Web
        • Error 해결
      • BackEnd
        • Spring
        • JPA
      • FrontEnd
        • HTML.CSS
        • JavaScript
      • Language
        • Java
      • Cloud
      • CSTS
      • Books
        • IT 5분 잡학사전
      • 일상
  • 블로그 메뉴

    • 홈
    • 방명록
    • 글쓰기
    • 관리
  • 링크

    • 깃허브
  • 공지사항

  • 인기 글

  • 태그

    LV.3
    백준
    LV.2
    자바
    노마드코더
    존안님
    코딩테스트
    BOJ
    스택
    HTML
    IT 잡학사전
    DP
    프로그래머스
    인프런
    lv2
    따라하며 배우는 html css
    lv.4
    DFS
    Til
    호텔 대실
    Lv.1
    구름톤 챌린지
    IT 5분 잡학사전
    제대로 파는 자바스크립트
    구름
    개발자북클럽
    BFS
    java
    Greedy
    그리디
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
gwee_99
[프로그래머스] Lv.2 호텔 대실 (Java)
상단으로

티스토리툴바