반응형
[프로그래머스] [1차] 추석 트래픽 c++
문제 설명
이번 추석에도 시스템 장애가 없는 명절을 보내고 싶은 어피치는 서버를 증설해야 할지 고민이다. 장애 대비용 서버 증설 여부를 결정하기 위해 작년 추석 기간인 9월 15일 로그 데이터를 분석한 후 초당 최대 처리량을 계산해보기로 했다. 초당 최대 처리량은 요청의 응답 완료 여부에 관계없이 임의 시간부터 1초(=1,000밀리초)간 처리하는 요청의 최대 개수를 의미한다.
입력 형식
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
배열에 대해 초당 최대 처리량을 리턴한다.
입출력 예제
예제1
- 입력: [
2016-09-15 01:00:04.001 2.0s,
2016-09-15 01:00:07.000 2s
] - 출력: 1
예제2
- 입력: [
2016-09-15 01:00:04.002 2.0s,
2016-09-15 01:00:07.000 2s
] - 출력: 2
- 설명: 처리시간은 시작시간과 끝시간을 포함하므로
첫 번째 로그는01:00:02.003 ~ 01:00:04.002
에서 2초 동안 처리되었으며,
두 번째 로그는01:00:05.001 ~ 01:00:07.000
에서 2초 동안 처리된다.
따라서, 첫 번째 로그가 끝나는 시점과 두 번째 로그가 시작하는 시점의 구간인01:00:04.002 ~ 01:00:05.001
1초 동안 최대 2개가 된다.
예제3
- 입력: [
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 2.31s,
2016-09-15 21:00:00.966 0.381s,
2016-09-15 21:00:02.066 2.62s
] - 출력: 7
- 설명: 아래 타임라인 그림에서 빨간색으로 표시된 1초 각 구간의 처리량을 구해보면
(1)
은 4개,(2)
는 7개,(3)
는 2개임을 알 수 있다. 따라서 초당 최대 처리량은 7이 되며, 동일한 최대 처리량을 갖는 1초 구간은 여러 개 존재할 수 있으므로 이 문제에서는 구간이 아닌 개수만 출력한다.
풀이 과정
요즘 회사에서 시간을 기준으로 range 파티션 된 db 테이블에 로그 데이터들을 insert 하는 코드를 계속 보다보니까 시간을 다른 데이터 타입으로 바꿔야 한다는 것을 금방 눈치채고 여기까지 진행은 굉장히 빠르게 했다. 하지만 제출 말고 실행 결과 테스트3 이 자꾸 2로 나와서 계속해서 고민하느라 앵간히 시간을 잡아 먹었다.
string
으로 표현된 시간에 한하여 잘 생각해보면double
형으로 다 바꿔줄 수 있다.- 문제에서 원하는 것은 1초당 처리량이니까, 기준을 1초로 잡고 모든 시간을 초 단위로 바꾼다 => 3600sec = 1h, 60sec = 1m
이전 시간의 응답 시작 시간 + 1 >= 현재 시간의 시작시간
이거나(||)이전 시간의 응답 완료 시간 + 1 > 현재 시간의 응답 시작 시간
을 찾을 수 있을 것이다. => 처리시간은 시작시간과 끝시간을 포함한다는 말에 휘둘려서 후자 조건에 = 을 붙였다가 계속 테스트가 하나를 실패함- 문제를 잘 이해하고 해결이 되지 않는다면 위 예시처럼 도식화하는 습관을... 아니 도식화해도 저말이 너무 애매한데... 나만 그렇게 생각한건가?
코드
#include <iostream>
#include <string>
#include <vector>
#include <time.h>
using namespace std;
// 처리시간은 시작시간과 끝시간을 포함
// lines는 응답완료시간 S를 기준으로 오름차순 정렬
int solution(vector<string> lines) {
int answer = 0;
int tps = 0; // tps 최대값 비교를 위한 변수
vector<pair<double, double>> response; // 응답시작시간, 응답완료시간
for(auto x : lines) {
string ss = x.substr(11,12);
double responseCompleteTime = (stod(ss.substr(0,2)) * 3600) + (stod(ss.substr(3,2)) * 60) + stod(ss.substr(6,2)) + (stod(ss.substr(9)) / 1000.0); // 응답완료시간
string temp = x.substr(24);
double throughputTime = stod(temp.substr(0, temp.length()-1)); // 처리시간
double responseStartTime = responseCompleteTime - throughputTime + 0.001;
response.push_back(make_pair(responseStartTime, responseCompleteTime));
}
for(int i = 0; i < response.size(); i++) {
double start = response[i].first;
double end = response[i].second;
tps = 1;
for(int j = i + 1; j < response.size(); j++) {
if(start+1 >= response[j].first || end+1 > response[j].first) {
tps++;
}
}
answer = max(answer, tps);
}
return answer;
}
반응형
'알고리즘 > 알고리즘 문제 풀이' 카테고리의 다른 글
[백준 BOJ] 2294 동전 2 c++ (0) | 2020.08.31 |
---|---|
[백준 BOJ] 2579 계단 오르기 C++ (0) | 2020.08.30 |
[프로그래머스] 길 찾기 게임 c++ (0) | 2020.08.25 |
[프로그래머스] 여행경로 c++ (0) | 2020.08.24 |
[프로그래머스] 이중우선순위큐 c++ (0) | 2020.08.23 |