solution 함수에 전달되는 lines 배열은 N(1 ≦ N ≦ 2,000)개의 로그 문자열로 되어 있으며, 각 로그 문자열마다 요청에 대한 응답완료시간 S와 처리시간 T가 공백으로 구분되어 있다.
응답완료시간 S는 작년 추석인 2016년 9월 15일만 포함하여 고정 길이 2016-09-15 hh:mm:ss.sss 형식으로 되어 있다.
처리시간 T는 0.1s, 0.312s, 2s 와 같이 최대 소수점 셋째 자리까지 기록하며 뒤에는 초 단위를 의미하는 s로 끝난다.
예를 들어, 로그 문자열 2016-09-15 03:10:33.020 0.011s은 "2016년 9월 15일 오전 3시 10분 33.010초"부터 "2016년 9월 15일 오전 3시 10분 33.020초"까지 "0.011초" 동안 처리된 요청을 의미한다. (처리시간은 시작시간과 끝시간을 포함)
서버에는 타임아웃이 3초로 적용되어 있기 때문에 처리시간은 0.001 ≦ T ≦ 3.000이다.
lines 배열은 응답완료시간 S를 기준으로 오름차순 정렬되어 있다.
solution 함수에서는 로그 데이터 lines 배열에 대해 초당 최대 처리량을 리턴한다.
입력된 문자열 별로 각각 시간, 분, 초, 밀리초, 처리 시간들의 위치를 substr을 이용하여 각각 h, m, s, ms, process에 저장한다.
그 값들을 모두 ms의 단위에 맞춰 바꾼 후 start_t와 end_t를 계산하여 모두 저장한다.
다시 이중 for문을 돌면서 end_time을 저장한 end_t[i]에 1초 후로 정해둔 후, 안 쪽 for문에서 start_t[j]가 정해둔 end_time보다 작을 때마다 count++를 해준다.
그 중에 최댓값을 구하여 answer에 넣어 return한다.
#include <string>
#include <vector>
using namespace std;
int solution(vector<string> lines) {
int answer = 0;
vector<int> start_t, end_t;
for(int i=0;i<lines.size();i++){
string h,m,s,ms;
int ih, im, is, process;
lines[i].pop_back();
h = lines[i].substr(11, 2);
m = lines[i].substr(14, 2);
s = lines[i].substr(17, 2);
ms = lines[i].substr(20, 3);
process = stof(lines[i].substr(24, 5)) * 1000;
ih = stoi(h) * 3600 * 1000;
im = stoi(m) * 60 * 1000;
is = stoi(s) * 1000 + stoi(ms);
start_t.push_back(ih+im+is-process+1);
end_t.push_back(ih+im+is);
}
for(int i = 0; i < lines.size(); i++)
{
int end_time = end_t[i] + 1000;
int count = 0;
for(int j = i; j < lines.size(); j++)
{
if(start_t[j] < end_time)
count++;
}
if(answer < count)
answer = count;
}
return answer;
}