반응형
programmers.co.kr/learn/courses/30/lessons/17678
구현을 통해 적절히 시간계산 하는 문제였습니다.
풀이방법
1. 문자열 정리 : "09:01"식으로 되어있는 timetable배열을 시간계산의 편리성을 위해 새로운 vector <int> timeInt 변수에 계산을 통해 분으로 바꾸고 저장합니다. 그 후 오름차순으로 정렬합니다.
2. 한 번의 버스 운행에 탑승하는 인원 계산 : 0번째 운행 ~ n번째 운행까지(loop) 확인하는데 매 loop마다 해당 운행시간보다 빨리 도착한 인원들을 세줍니다. 수용인원을 넘어가거나 timeInt배열의 size를 넘어가면 가장 안쪽 loop를 탈출합니다.
3. 정답 도출
3-1. 만약 타는 인원이 m명 미만이면 answer = 막차시간
3-2. else 면 새치기 해야되므로 answer = 가장 마지막에 도착한 손님 - 1
Code
#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
vector <int> getIntTime(vector<string> &timetable){
vector <int> timeInt;
for(int i = 0; i < timetable.size(); i++){
int hour = stoi(timetable[i].substr(0,2));
int minute = stoi(timetable[i].substr(3,2));
int totalMinute = hour * 60 + minute;
timeInt.push_back(totalMinute);
}
return timeInt;
}
string getTimeString(int time){
string tmp = "";
int hour = time / 60;
int minute = time % 60;
if(hour < 10) tmp += "0";
tmp += to_string(hour) + ":" ;
if(minute < 10) tmp += "0";
tmp += to_string(minute);
return tmp;
}
string solution(int n, int t, int m, vector<string> timetable) {
string answer = "";
int pivot = 0, cnt =0;
vector <int> timeInt = getIntTime(timetable);
sort(timeInt.begin(),timeInt.end());
for(int busTime = 0; busTime < n * t; busTime += t){
int shuttleTime = 9 * 60 + busTime;
for(cnt = 0; pivot + cnt < timeInt.size() && cnt < m; cnt++){
if(timeInt[pivot + cnt] > shuttleTime) break;
}
pivot += cnt;
}
if(cnt < m) answer = getTimeString(9 * 60 + (n-1) * t);
else answer = getTimeString(timeInt[pivot-1] - 1);
return answer;
}
int main(){
vector<string> t = {"09:00", "09:00", "09:00", "09:00"};
cout << "정답이 뭐에요? " << solution(2,1,2,t);
}
'Algorithm > Implementation' 카테고리의 다른 글
(C++) - 백준(BOJ) 1051번 : 숫자 정사각형 답 (0) | 2021.01.09 |
---|---|
(C++) - 백준(BOJ) 2851번 : 슈퍼마리오 답 (0) | 2021.01.09 |
(C++) - 프로그래머스(찾아라 프로그래밍 마에스트로) : 폰켓몬 답 (0) | 2021.01.01 |
(C++) - 프로그래머스(2017 팁스타운) : 짝지어 제거하기 답 (0) | 2020.12.31 |
(Javascript) - 프로그래머스(월간코드챌린지) : 이진 변환 반복하기 답 (0) | 2020.12.30 |