https://school.programmers.co.kr/learn/courses/30/lessons/155651
이 문제는 대실 시간이 겹치는 횟수를 구하면 해결할 수 있다.
주어진 배열에는 입장 시간과 퇴실 시간이 주어진다.
입장 시간과 퇴실 시간은 ':'을 기준으로 시간과 분이 나누어 진다.
따라서 문자열에서 2개의 요소를 substr하고 나머지는 분으로 사용한다. 이때 시간에 100을 곱해서 15:10을 1510으로 만들어준다.
하지만 퇴실 시간의 경우 10분의 청소 시간이 있으므로 입장 시간과 동일한 연산에 10을 더해준다.
퇴실 시간에 100을 나눈 나머지는 분이 나온다.
이때 분 값이 60 이상인 경우가 생긴다. 이 경우는 청소 시간인 10분을 더했기 떄문이다.
즉, 15:58분에 10을 더하면 15:68분이 나올 수 있는 것이다. 이 경우를 해결하기 위해 퇴실 시간에 40을 더한다.
이러면 15:58분에 청소 시간을 더한 결과가 16:08분이 될 수 있다.
마지막으로 호텔 방 시간의 최대 계수를 2400이 아닌 2410을 한 이유이다.
이는 23:59이 퇴실 시간인 경우 10분의 청소 시간을 위해 2410으로 정하였다.
2410개의 호텔 방 시간에 입장 시간부터 퇴실 시간까지 1을 증가시킨다.
그러면 호텔 방에 겹쳐 머무르는 시간이 생길 것이다.
겹친 시간의 최대 값을 반환하면 문제를 해결할 수 있다.
#include <string>
#include <vector>
using namespace std;
int solution(vector<vector<string>> book_time)
{
int answer = 0, room[2410]={0,};
int n = book_time.size();
for(int i=0;i<n;i++)
{
int s = stoi(book_time[i][0].substr(0,2))*100 + stoi(book_time[i][0].substr(3));
int e = stoi(book_time[i][1].substr(0,2))*100 + stoi(book_time[i][1].substr(3)) + 10;
if(e % 100 >= 60) e += 40;
for(int j=s;j<e;j++) room[j]++;
}
for(int i=0;i<2400;i++) answer = max(answer, room[i]);
return answer;
}
'Programmers Review' 카테고리의 다른 글
[Lv 1] 이상한 문자 만들기 (0) | 2024.05.27 |
---|---|
[Lv 2] 뒤에 있는 큰 수 찾기 (0) | 2024.05.27 |
[Lv 2] 미로 탈출 (0) | 2024.05.24 |
[Lv 2] 리코쳇 로봇 (0) | 2024.05.22 |
[Lv. 2] 광물캐기 (0) | 2024.05.18 |