[프로그래머스] Lv.2 호텔 대실 JAVA 풀이
문제 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
* 독학으로 익히는 코딩이라 틀린 것이 있을 수 있습니다. 오류가 있다면 댓글을 통해 알려주세요. 감사합니다. *