본문 바로가기
Programmers/Lv.2

[프로그래머스] Lv.2 호텔 대실 JAVA 풀이

by Poorm 푸름 2023. 10. 10.

문제 Lv.2 호텔 대실

 :  최소한의 객실만을 사용하여 예약 손님 받기
    사용한 객실은 퇴실하고 10분간 청소를 한 다음 다른 손님들 사용가능

 :  예약 시각 = book_time ( 문자열 형태 2차원 배열 )
    
1 ≤ book_time의 길이 ≤ 1,000
     book_time[i] = ["HH:MM", "HH:MM"]  =  [대실 시작 시각, 대실 종료 시각] 형태

 

 :  예약 시각이 자정을 넘어가는 경우는 X
    시작 시각은 항상 종료 시각보다 빠르다

 :  입력 예

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

 

 :  출력 예
    book_timeresult = 3

 

 

[알아두기]

 < Replace >

 

 :  String replace(CharSequnce target, CharSequence replacement)
 :  자신이 바꾸고싶은 문자로 문자열을 치환시켜주는 기능

String a = "무궁화 삼천리 화려강산 대한사람 대한으로 길이 보전하세 ";	
//replace([기존문자],[바꿀문자])
a= a.replace("대한", "민국");	
System.out.println(a);

//결과값 : 무궁화 삼천리 화려강산 민국사람 민국으로 길이 보전하세
String replace(CharSequnce target, CharSequence replacement)

 

 

 < Arrays.sort 2차원 배열 정렬 >

 

  (2차원 배열인 [ A, B ] 에서 A는 0번째 B는 1번째라고 표현가능)

 
 (EX)          arr =  [ 5, 40 ], 4, 20 ], [ 1, 30 ] 라면

-  (o1, o2) -> o1[0]-o2[0]   :  0번째 숫자 기준 오름차순   ▶ [ 1, 30 ] - [ 4, 20 ] - [ 5, 40 ] 

-  (o1, o2) -> o2[0]-o1[0]   :  0번째 숫자 기준 내림차순    [ 5, 40 ] - [ 4, 20 ] - [ 1, 30 ]   

 (o1, o2) -> o1[1]-o2[1]   :  1번째 숫자 기준 오름차순    [ 4, 20 ] - [ 1, 30 ] - [ 5, 40 ] 

-  (o1, o2) -> o2[1]-o1[1]   :  1번째 숫자 기준 내림차순    [ 5, 40 ] - [ 1, 30 ] - [ 4, 20 ]

 

[코드]

import java.util.*;

class Solution {
    public int solution(String[][] book_time) {
        int answer = 0;
        
        int[][] time = new int[book_time.length][2];
        
        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;
            }
            
            time[i][0]=start;
            time[i][1]=end;
        }
        Arrays.sort(time, (o1, o2) ->{
            if(o1[0] > o2[0]) return 1;
            else if(o1[0] < o2[0]) return -1;
            else {
                if(o1[1]>o2[1]) return 1;
                else return -1;
            }
        });
        
        PriorityQueue<Integer> visit = new PriorityQueue<>();
        
        for(int[] arr : time){
            if(visit.size() == 0) {
                visit.add(arr[1]);
                continue;
            }
            
            if(arr[0] >= visit.peek()){
                visit.poll();
                visit.add(arr[1]);
            }
            else {
                visit.add(arr[1]);
            }
        }
        return visit.size();
      
    }
}

 

 :  int[][] time = new int[book_time.length][2];  열 = 시작시간 / 종료시간 = 2
        
 :  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;  끝시간마다 무조건 10 더해준다
            
            if(end%100>=60){  60분 넘어갈 경우 (100으로 나누면 나머지에 분만 나온다)
                end+=40;  60분 이상이면 +40 해서 백의 자리수를 하나 올려준다 = 시간 증가
            }
            
            time[i][0]=start;  0번째 열에는 시작시간
            time[i][1]=end;  1번째 열에는 끝시간
        }

 :  Arrays.sort(time, (o1, o2) ->{ o1, o2 기준으로 0번째 = start, 1번째 = end
                                                      return 값이 적은 순서대로 정렬

            if(o1[0] > o2[0]) return 1;  시작 시간이 느리면 1 
            else if(o1[0] < o2[0]) return -1;  시작 시간이 빠르면 -1
            else {
                    if(o1[1]>o2[1]) return 1;  끝시간이 느리면 1
                    else return -1;  끝시간이 빠르면 -1
            }
   });
        
 :  PriorityQueue<Integer> visit = new PriorityQueue<>(); 우선순위 큐
        
 :  for(int[] arr : time){  arr배열에 time 넣기
          if(visit.size() == 0) {  방문큐 사이즈가 0일 때
                visit.add(arr[1]);  방문큐에 arr[1] 즉, 종료시간 추가
                continue;
          }
            
          if(arr[0] >= visit.peek()){  시작시간이 방문큐 peek 즉 이전 사용자 종료시간 보다 같거나 클 경우
                visit.poll();  이전방문자 방문큐에서 퇴실시키고
                visit.add(arr[1]);  현방문자의 arr[1] 종료시간을 방문큐에 입력
          }
     

          else {  시작시간이 이전 사용자 종료시간 보다 작을 경우
                visit.add(arr[1]);  새로운 방에 들어가야하므로 이전방문자와 함께 누적해서 방문큐에 종료시간 추가
          }
   }
       

 :  return visit.size();  방문큐의 size는 머물고 있는 사람들의 종료시간이며

                                     퇴실하지 못한 손님들이므로 최종 방개수를 뜻한다
      
  

 

 

https://school.programmers.co.kr/learn/courses/30/lessons/155651?language=java

 

프로그래머스

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

programmers.co.kr

 

 

 

* 독학으로 익히는 코딩이라 틀린 것이 있을 수 있습니다. 오류가 있다면 댓글을 통해 알려주세요. 감사합니다. *