Post

[코딩테스트] 23/12/11 - 호텔 대실 (Level2)

🌜 프로그래머스 링크

문제 설명

호텔을 운영 중인 코니는 최소한의 객실만을 사용하여 예약 손님들을 받으려고 합니다. 한 번 사용한 객실은 퇴실 시간을 기준으로 10분간 청소를 하고 다음 손님들이 사용할 수 있습니다. 예약 시각이 문자열 형태로 담긴 2차원 배열 book_time이 매개변수로 주어질 때, 코니에게 필요한 최소 객실의 수를 return 하는 solution 함수를 완성해주세요.

제한사항

  • 1 ≤ book_time의 길이 ≤ 1,000
    • book_time[i]는 [“HH:MM”, “HH:MM”]의 형태로 이루어진 배열입니다
      • [대실 시작 시각, 대실 종료 시각] 형태입니다.
    • 시각은 HH:MM 형태로 24시간 표기법을 따르며, “00:00” 부터 “23:59” 까지로 주어집니다.
      • 예약 시각이 자정을 넘어가는 경우는 없습니다.
      • 시작 시각은 항상 종료 시각보다 빠릅니다.

문제풀이

  • 시간 시작순으로 정렬한다.
    • 이떄 끝나는 시간에 + 10을 해준다.
  • 정렬된 시간을 루프하여 현재 방개수를 추가하거나 제거해준다.
    • answer는 현재 방개수와 answer중 높은값을 가진다.

Github 링크

코드 (C++)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
int TimeToMinutes(string time) {
    int hours = stoi(time.substr(0, 2));
    int minutes = stoi(time.substr(3, 2));
    return hours * 60 + minutes;
}
int solution(vector<vector<string>> book_time) {
    int answer = 0;
    vector<pair<int, int>> time;
    for (int i = 0; i < book_time.size(); ++i)
    {
        Time temp;
        time.emplace_back(TimeToMinutes(book_time[i][0]), 1);
        time.emplace_back(TimeToMinutes(book_time[i][1]) + 10, -1);
    }
    sort(time.begin(),time.end());
    int cur = 0;
    for (int i = 0; i < time.size(); ++i)
    {
        cur += time[i].second;
        answer = max(answer, cur); 
    }
    
    return answer;
}

피드백

  • 처음에는 아래와 같이 구현하였다.
  • 하지만 다른사람이 풀이한게 속도도 더빠르고 짦고 간결하다. ㅠ.ㅠ
  • 방마다 시간을두고 비교해서 빈방이없으면 개수를 추가하도록했는데 그냥 현재시간에따라 방개수만 올리거나 내리면 되는간단한 문제였다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
int TimeToMinutes(string time) {
    int hours = stoi(time.substr(0, 2));
    int minutes = stoi(time.substr(3, 2));
    return hours * 60 + minutes;
}
// 비교 함수
static bool CompareTasks(const Time& a, const Time& b) {
    return a.first < b.first;
}
int solution(vector<vector<string>> book_time) {
    int answer = 0;
    vector<Time> time;
    for (int i = 0; i < book_time.size(); ++i)
    {
        Time temp;
        temp.first = TimeToMinutes(book_time[i][0]);
        temp.second = TimeToMinutes(book_time[i][1])+ 10;
        time.push_back(temp);
    }
    sort(time.begin(), time.end(), CompareTasks);
    int curTime;
    vector<int> room;
    for (int i = 0; i < time.size(); ++i)
    {
        bool hasRoom = false;
        int minTime = numeric_limits<int>::max();
        int roomIndex = -1;
        for (int r = 0; r < room.size(); ++r)
        {
            if (room[r] <= time[i].first && minTime > room[r] - time[i].first)
            {
                minTime = room[r] - time[i].first;
                hasRoom = true;
                roomIndex = r;
            }
        }
        if (hasRoom)
        {
            room[roomIndex] = time[i].second;
       
        }
        else
        {
            room.push_back(time[i].second);
            answer++;
        }
    }
    
    return answer;
}
This post is licensed under CC BY 4.0 by the author.