할머니의 콤퓨타 도전기

Programmers: 추석 트래픽 본문

Algorithm/Problem Solving

Programmers: 추석 트래픽

ji.o.n.e 2021. 4. 28. 02:34

programmers.co.kr/learn/courses/30/lessons/17676

 

코딩테스트 연습 - [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-1

programmers.co.kr

풀이 과정

  • string 으로 표현된 시간을 int로 다 바꾸어 주었다. 이때 소수점을 처리하기 위해 ms 단위로 바꾸었다.
  • 요청량이 변하는 순간은 각 로그의 시작과 끝뿐이다.
  • 또한 lines 배열은 응답완료시간 S를 기준으로 오름차순 정렬되어 있다.
  • 따라서 현재 로그의 완료 시간 + 1000(ms)보다 시작 시간이 이전이면 해당 구간에 포함되는 로그임으로 count를 하나씩 증가시켜준다.
#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

int solution(vector<string> lines) {
    int answer = 0;
    vector<int> starts;
    vector<int> ends;
    
    // ms 단위로 다 바꿈
    for(int i = 0; i < lines.size(); i++){
        lines[i].pop_back();
        int h = stoi(lines[i].substr(11,2)) * 3600 * 1000;
        int m = stoi(lines[i].substr(14,2)) * 60 * 1000;
        int s = stod(lines[i].substr(17,6)) * 1000;
        int process = stod(lines[i].substr(24,5)) * 1000;
        starts.push_back(h + m + s - process + 1);
        ends.push_back(h + m + s);
    }
    
    for(int i = 0; i < lines.size(); i++){
        int e = ends[i] + 1000;
        int cnt = 0;
        for(int j = i; j < lines.size(); j++){
            if(e > starts[j])
                ++cnt;
        }
        answer = max(answer, cnt);
    }
    return answer;
}

그런데 로그의 시작과 끝 지점 모두 체크를 해줘야하는게 아닌가라는 의문이 들었다. (위 코드는 끝 지점에서만 검사함)

응답완료시간을 기준으로 오른차순 정렬되어있기에 끝 지점만 체크해도 괜찮을 것이라 생각했는데, 혹시 틀렸다면 댓글 부탁드려용

Comments