PROGRAMMERS 프로그래머스 : 셔틀버스
Updated:
시작하면서
이번 문제는 구현 문제이다.
문제 아이디어
처음 문제를 읽으면 난해함을 느낄 수 있다. 규칙은 다음과 같다.
- 최초의 셔틀 버스는 09:00 시에 온다.
- 셔틀 버스는 t분 간격으로 n번 만큼 오고, 한 번에 m명을 태울 수 있다.
해당 규칙들로 문제를 해결해야 한다. 방법은 다음과 같다.
- string으로 되어있는 timetable을 모두 seconds(int)로 변경해서 오름차순으로 정렬한다.
- 가장 빨리 줄을 선 크루부터 한 명씩 세어가면서 버스 줄의 마지막이 되면 해당 시간을 string으로 변경해서 리턴한다.
- 마지막 버스의 마지막 번째 크루보다 1초 빠르게 오는게 정답
- 마지막 크루까지 태웠는데도 버스의 자리가 남으면, 마지막 버스 도착 시간이 정답
해결
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int TimeToSeconds(string time)
{
int seconds = 0;
seconds += stoi(time.substr(0, 2)) * 60;
seconds += stoi(time.substr(3, 2));
return seconds;
}
string SecondsToTime(int seconds)
{
string time;
int hoursPart = seconds / 60;
int secondsPart = seconds - 60 * (seconds / 60);
time = to_string(hoursPart) + ":" + to_string(secondsPart);
if (hoursPart < 10)
{
time.insert(0, "0");
}
if (secondsPart < 10)
{
time.insert(3, "0");
}
return time;
}
string solution(int n, int t, int m, vector<string> timetable)
{
vector<int> timetableSeconds;
for (int i = 0; i < timetable.size(); i++)
{
timetableSeconds.push_back(TimeToSeconds(timetable[i]));
}
sort(timetableSeconds.begin(), timetableSeconds.end(), less<int>());
int currentIndex = 0, currentPassangerCount = 0;
int remainingShuttleCount = n;
int currentTimeSeconds = 9 * 60;
string answer = "";
while (true)
{
while (currentTimeSeconds >= timetableSeconds[currentIndex])
{
currentIndex++;
currentPassangerCount++;
if (currentPassangerCount == m)
break;
if (currentIndex >= timetableSeconds.size())
return SecondsToTime(currentTimeSeconds);
}
remainingShuttleCount--;
if (remainingShuttleCount == 0)
{
if (currentPassangerCount < m)
{
answer = SecondsToTime(currentTimeSeconds);
}
else
{
answer = SecondsToTime(timetableSeconds[currentIndex - 1] - 1);
}
break;
}
currentTimeSeconds += t;
currentPassangerCount = 0;
}
return answer;
}
Leave a comment