반응형
문제출처
https://programmers.co.kr/learn/courses/30/lessons/17678
문제풀이
string 형태의 시간을 int형 분으로 변환하여 풀이했다. 변환한 벡터를 오름차순으로 정렬한 뒤 순차적으로 크루들을 탑승시킨다. 이때 마지막 버스인데 타지 못할 경우 마지막 탑승자보다 1분 빨리오는 예외처리가 필요하다.
2번째 for문에서 탑승할 인원을 체크하고 예외 처리 이후 int형 분을 다시 string형 시간으로 변환하여 return해주면 되는 문제.
핵심은 주어진 문자열을 연산할 때 어떻게 처리하고 정렬을 이용하는 것 같다.
소스코드
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
const int START_BUS_MINUTE = 9 * 60;
const int LAST_BUS_MINUTE = 24 * 60;
int getIntMinute(string time) {
int ret = ((time[0]-'0')*10 + (time[1]-'0')) * 60;
ret += (time[3]-'0')*10 + (time[4]-'0');
return ret;
}
string getStringTime(int time) {
string ret = to_string((time/600));
ret += to_string((time/60)%10);
ret += ':';
ret += to_string((time%60)/10);
ret += to_string((time%60)%10);
return ret;
}
string solution(int n, int t, int m, vector<string> timetable) {
string ret = "";
vector<int> v;
for (int i=0; i<timetable.size(); i++) v.push_back(getIntMinute(timetable[i]));
sort(v.begin(), v.end());
int boardCount = 0;
int startTime = START_BUS_MINUTE;
for (int i=0; i<n; i++) {
// 문제 조건 23:59까지만 가능
if (startTime > LAST_BUS_MINUTE) break;
int maxBoardCount = m;
for (int j=boardCount; j<v.size(); j++) {
if (maxBoardCount == 0 || v[j] > startTime) break;
boardCount++;
maxBoardCount--;
}
// 마지막 버스
if (i == n-1) {
// 탑승할 자리가 없는 경우 1분 일찍 나옴
if (maxBoardCount == 0) startTime = v[boardCount-1] - 1;
} else startTime += t;
}
ret = getStringTime(startTime);
return ret;
}
반응형
'Algorithm' 카테고리의 다른 글
[BOJ 17143] 낚시왕 (0) | 2020.05.13 |
---|---|
[BOJ 17779] 게리맨더링2 (0) | 2020.05.12 |
[프로그래머스 17682 - 카카오 2018 1차] 캐시 (0) | 2020.05.02 |
[프로그래머스 17682 - 카카오 2018 1차] 다트 게임 (0) | 2020.04.29 |
[프로그래머스 17681 - 카카오 2018 1차] 비밀지도 (2) | 2020.04.29 |