본문 바로가기
알고리즘/프로그래머스

[ 프로그래머스 / 문자열 ] 추석 트래픽 (2018 KAKAO BLIND RECRUITMENT)

by 뎁꼼 2020. 7. 28.

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;
}