쌓고 쌓다
[프로그래머스] 호텔 대실 C++ 풀이 및 해설 본문
https://school.programmers.co.kr/learn/courses/30/lessons/155651
풀이 방법
예약 시간들이 주어졌다.
00:00시부터 24:00시까지 값을 가지는 배열이 있다고 생각하자.
현재 배열의 값은 0으로 초기화되어있다.
입실 시간부터 퇴실 시간까지 값을 1 더해준다.
다음 예약 시간의 입실 시간부터 퇴실 시간까지 값을 1 더해준다.
이렇게 더해주면 겹치는 부분은 +1씩 겹치는 만큼 값을 갖는다.
이때 배열의 값중에서 제일 큰 값이 모든 방을 관리하는데 필요한 방의 개수이다!
입실 시간부터 퇴실시간까지를 배열로 어떻게 관리할까?
입실 시간과 퇴실 시간을 가지고 00:00부터 얼만큼 분이 흘렀는지를 통해 시간을 관리한다.
예를 들어
입실 시간이 01:00 이라면 00:00부터 1시간이 지났으므로 60(분)의 값을 갖는다.
퇴실 시간이 02:00 이라면 00:00부터 2시간이 지났으므로 120(분)의 값을 갖는다.
이제 입실 시간부터 퇴실시간까지 배열의 값은
인덱스 60(분)부터 120(분)까지 +1을 해주면 된다.
배열의 크기는 어떻게 할까?
최대 24:00시간까지 가능하므로 24*60인 1440.
여기서 청소에 9분이 들어가므로 1449가 필요한 배열의 크기이다.
청소는 10분이 걸리는거 아닌가? 맞다.
그러나 청소가 끝나자말자 입실이 가능하기에 계산상 9분을 더해주면 된다.
전체 코드
#include <string>
#include <vector>
#include <iostream>
using namespace std;
int solution(vector<vector<string>> book_time) {
int answer = 0;
int arr[1450];
fill(&arr[0], &arr[1450], 0);
// 24:00는 1440분이고 9분을 더하면 1449분이다. 배열 크기 1450으로 설정
for(int i=0; i<book_time.size(); i++) {
string startTime, endTime;
int startMin=0;
int endMin=0;
startMin+=(book_time[i][0][0]-'0')*600;
startMin+=(book_time[i][0][1]-'0')*60;
startMin+=(book_time[i][0][3]-'0')*10;
startMin+=(book_time[i][0][4]-'0');
endMin+=(book_time[i][1][0]-'0')*600;
endMin+=(book_time[i][1][1]-'0')*60;
endMin+=(book_time[i][1][3]-'0')*10;
endMin+=book_time[i][1][4]-'0';
endMin+=9; // 10분간 청소이므로 9분간 사용이 불가능하다.
for(int idx=startMin; idx<=endMin; idx++) {
arr[idx]++;
answer=max(answer, arr[idx]);
}
}
return answer;
}
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 마법의 엘리베이터 C++ 풀이 및 해설 (0) | 2023.09.13 |
---|---|
[프로그래머스] 배달 C++ 풀이 및 해설 (0) | 2023.09.07 |
[프로그래머스] 줄 서는 방법 C++ 풀이 및 해설 (0) | 2023.08.27 |
[프로그래머스] 전력망을 둘로 나누기 C++ 풀이 및 해설 (0) | 2023.08.21 |
[프로그래머스] [3차] 방금그곡 C++ 풀이 및 해설 (0) | 2023.08.20 |
Comments