1. 문제
코딩테스트 연습 - [1차] 추석 트래픽
입력: [ 2016-09-15 20:59:57.421 0.351s, 2016-09-15 20:59:58.233 1.181s, 2016-09-15 20:59:58.299 0.8s, 2016-09-15 20:59:58.688 1.041s, 2016-09-15 20:59:59.591 1.412s, 2016-09-15 21:00:00.464 1.466s, 2016-09-15 21:00:00.741 1.581s, 2016-09-15 21:00:00.748
programmers.co.kr
2. 소스코드
- 이 문제에서 핵심은 3가지인 것 같다.
1) 문자열을 처리할 수 있는가?
2) 처리시간은 시작 시간과 끝 시간을 포함한다
3) endtime 기준으로 정렬된 배열을 활용할 수 있는가?
- 1)을 처리하는 방법은 sscanf가 가장 무난한 솔루션인 것 같다. 하지만 나는 scanf 혐오증이 있어서 사용하질 않았다.
- 2)는 말그대로 처리시간에 시작 시간과 끝 시간이 포함된다는 것. 따라서 startTime은 endTime - cost(수행시간) + 1ms가 된다. 그리고 나중에 구간 내 포함되는지 판별할때, endTime을 기준으로 + 999ms 를 해야 1초 구간이 된다.
- 3)은 endTime을 기준으로 정렬이 되어 있기 때문에 하나의 기준을 잡았을 때 모든 time을 비교할 필요가 없고, 다른 라인의 startTime이 기준보다 앞에 있는지만 확인해주면 된다.
예를 들어, endTime[0]은 endTime[1] 보다 항상 먼저 끝이난다. endTime[0]에 999ms 를 더해 기준범위(range)을 세웠다면, 나머지 뒤의 endTime들만 체크하면된다.
또한, startTime[1]이 range 앞에만 있게 되면, 항상 구간 내에 포함됨이 보장된다. 왜냐하면, time out 시간이 3s로 정해져있고, endTime[1]은 항상 endTime[0] 뒤에 존재하기 때문이다.
소스코드
#include <string>
#include <vector>
#include <sstream>
using namespace std;
vector<pair<int, int>> timeLines;
void setTimeLine(const vector<string>& lines) {
for (string log : lines) {
stringstream stream; stream.str(log);
string temp;
stream >> temp >> temp;
int hour = stoi(temp.substr(0, 2)) * 3600 * 1000;
int min = stoi(temp.substr(3, 2)) * 60 * 1000;
int sec = stod(temp.substr(6)) * 1000;
stream >> temp;
int cost = stod(temp.substr(0, temp.size() - 1)) * 1000;
int endTime = hour + min + sec;
int startTime = endTime - cost + 1;
timeLines.push_back({ startTime,endTime });
}
}
int solution(vector<string> lines) {
int answer = 0;
int size = lines.size();
timeLines.reserve(size);
setTimeLine(lines);
for (int i = 0; i < size; ++i) {
int range = timeLines[i].second + 999;
int cnt = 1;
for (int j = i + 1; j < size; ++j)
if (timeLines[j].first <= range) cnt++;
if (cnt > answer) answer = cnt;
}
return answer;
}
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[ 프로그래머스 / 구현 ] 키패드 누르기 (2020 카카오 인턴십) (0) | 2020.07.25 |
---|---|
[ 프로그래머스 / stack ] 수식 최대화 (2020 카카오 인턴십) (0) | 2020.07.25 |
[ 프로그래머스 / 구현 ] 압축 (2018 KAKAO BLIND RECRUITMENT) (0) | 2020.07.23 |
[ 프로그래머스 / 문자열 / 진법 ] [3차] n진수 게임 (Kakao) (0) | 2020.07.10 |
[ 프로그래머스 / 문자열 ] [3차] 방금그곡도움말 (KaKao) (0) | 2020.07.09 |