쌓고 쌓다

[프로그래머스] 호텔 대실 C++ 풀이 및 해설 본문

알고리즘/프로그래머스

[프로그래머스] 호텔 대실 C++ 풀이 및 해설

승민아 2023. 8. 30. 17:03

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

 

프로그래머스

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

programmers.co.kr

 

풀이 방법

예약 시간들이 주어졌다.

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;
}
Comments