#include <string>
#include <vector>
#include <iostream>
#include <queue>
using namespace std;
void parse_time(string &line, int *start_time, int *end_time)
{
int hour=0;
int mi=0;
int sec=0;
int ms=0;
int cnt = 0;
int play_sec = 0;
int play_ms = 0;
for(int i = 11; i < line.size(); i++)
{
if (line[i] < '0' || line[i] > '9')
{
cnt++;
continue;
}
else{
if(cnt == 0)
hour = 10*hour + line[i] - '0';
else if (cnt == 1)
mi = 10*mi + line[i] - '0';
else if (cnt == 2)
sec = 10*sec + line[i] - '0';
else if ( cnt == 3)
ms = 10*ms + line[i] - '0';
else if (cnt == 4)
play_sec = 10*play_sec + line[i] - '0';
else if (cnt == 5)
play_ms = 10*play_ms + line[i] - '0';
}
}
if((play_sec *1000) + play_ms > 3000)
{
play_sec = 3;
play_ms = 0;
}
*end_time = (hour*1000*60*60) + (mi*1000*60) + (sec*1000) + ms;
*start_time = *end_time - (play_sec* 1000) - play_ms + 1;
}
int solution(vector<string> lines) {
int answer = 1;
int temp_start_time = 0;
int temp_end_time = 0;
priority_queue<int,vector<int>,less<int> > pq;
parse_time(lines.back(),&temp_start_time, &temp_end_time);
pq.push(temp_start_time);
for(int i = lines.size()-2 ;i >=0 ;i--)
{
int start_time = 0;
int end_time = 0;
parse_time(lines[i],&start_time, &end_time);
temp_start_time = pq.top();
if (temp_start_time - 1000 < end_time )
pq.push(start_time);
else
{
while(1)
{
if(pq.empty())
{
pq.push(start_time);
break;
}
if (end_time <= pq.top() - 1000)
pq.pop();
else
{ pq.push(start_time);
break;
}
}
}
answer = max(answer, (int)pq.size());
}
return answer;
}
2018 카카오 블라인드 테스트 맨 마지막 문제이다.
1초의 구간동안 동시에 최대 몇개의 트래픽을 처리해야 하는지 구하는 문제이다.
24시간을 ms로 나타내면 24 × 60 × 60 × 1000 =86,400,000이다.
이를 모두 어레이로 만들어서 겹치는 곳의 카운트를 세서 답을 구하는 방식이 있지만, 조금 빠른 방법이 생각나서 minheap구조인 priority queue를 이용하기로 했다. less는 큰값부터 뱉고, greater은 작은값부터 뱉는다. 구현 과정이 생각보다 까다로워서 조금 오래걸렸다. 우선 시간은 endpoint를 기준으로 sort되어서 입력이 들어온다. 즉, startpoint의 순서는 제각각이다. 나는 input을 거꾸로 탐색하면서 startpoint를 minheap에 넣고, minheap top에 있는 값 - 1000(1s)과 현재의 endpoint를 비교하며 만약 구간을 벗어났을경우 minheap에서 구간을 만족할 때까지 pop을 한다. 답은 loop를 돌면서 가진 최대 minheap의 크기이다.