문제 설명
추석 트래픽
이번 추석에도 시스템 장애가 없는 명절을 보내고 싶은 어피치는 서버를 증설해야 할지 고민이다. 장애 대비용 서버 증설 여부를 결정하기 위해 작년 추석 기간인 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초 구간은 여러 개 존재할 수 있으므로 이 문제에서는 구간이 아닌 개수만 출력한다.
풀이 : 24시간을 0.001초 배열로 만든 후 각각 하나씩 저장해서 최대트래픽을 계산한다.
24 시간 을 ms 초 로 만들면 86400000 ms
int의 최대 크기는? ->-2,147,483,648 ~ 2,147,438,647
임으로 int traffic[86400001] 배열을 만든다.
2016-09-15 hh:mm:ss.sss
2 0 1 6 - 0 9 - 1 5 ( ) h h : m m : s s . s s s () 형식
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 ...
T(처리시간)
처리시간 T는 0.1s, 0.312s, 2s 와 같이 최대 소수점 셋째 자리까지 기록하며 뒤에는 초 단위를 의미하는 s로 끝난다.
lines[i].pop_back() 하면 s 지워짐
최대 크기는 0.000 이다. 즉 -> 크기는 5
잘라서 크기가 5가 안되면 5가 되도록 만들어주자
크기가 1 이면 "." 붙이고 000 붙이기
크기가 3 이상 5미만 이면 5가 될때 까지 0 붙여주기
lines[i].substr(24,5) ; --> 최대 크기가 5임으로 5보다 크기가 작은 것은 그냥 마지막 까지 문자열을 반환함.
그리고 int 타입으로 바꿔 줘야 함으로 str 중 '.' 을 제거
str.erase(str.begin()+1);
stoi(str);
하면 됨
int hh = stoi(lines[i].substr(11,2));
int mm = stoi(lines[i].substr(14,2));
int ss = stoi(lines[i].substr(17,2));
int sss = stoi(lines[i].substr(20,3));
을 처리 시간 T 로 계산해서 first_time 과 last_time까지 시간배열에 저장 시킨다.'
이때 first_time은 -999ms 까지 효력이 있으므로 -999 해주기
last_time은 +999ms 까지 효력이 있으므로 +999 해주기
#include <string>
#include <vector>
#include <iostream>
//str.erase(str.begin(), str.begin()+j); --> str[j-1] 까지 짤리고 str[j]~str[N] 까지 출력
//str.substr(0,1); --> str[0]
//str.substr(0,2); --> str[0] str[1] 출력
using namespace std;
int traffic [86400001];
string make_T (string s){
if(s.size()==1){
s.push_back('.');
}
if(s.size()<5){
while(s.size() != 5){
s.push_back('0');
}
}
return s;
}
int read_T(string s){
s.erase(s.begin()+1);
return stoi(s);
}
int solution(vector<string> lines) {
int lines_size = lines.size();
for(int i=0; i<lines_size; i++){
int hh = stoi(lines[i].substr(11,2));
int mm = stoi(lines[i].substr(14,2));
int ss = stoi(lines[i].substr(17,2));
int sss = stoi(lines[i].substr(20,3));
lines[i].pop_back();
string s_T = make_T(lines[i].substr(24,5));
int T = read_T(s_T);
// 계산
hh = hh*60*60*1000;
mm = mm*60*1000;
ss = ss*1000;
int last_time = hh+mm+ss+sss+999; // last_time 의 효력은 last_time 이 걸친 1초까지 효력이 있다.
// if last_time = 0 이면 999ms 까지 효력이 있음
int first_time = last_time - T +1-999; // first_time 도 - 999ms 까지 효력이 있음
if(first_time<0) { first_time = 0;}
if(last_time>=86400001) {last_time = 86400000;}
for(int j= first_time; j<=last_time; j++){
traffic[j]++;
}
}
int ans = 0;
for(int i=0; i<86400001; i++){
if(ans<traffic[i]){
ans = traffic[i];
}
}
return ans;
}
'알고리즘 일기' 카테고리의 다른 글
프로그래머스: 자물쇠와 열쇠 (0) | 2019.12.04 |
---|---|
프로그래머스 : 브라이언의 고민 (0) | 2019.12.01 |
7453번 : 합이 0인 네 정수 (0) | 2019.11.30 |
2143번: 두 배열의 합 (0) | 2019.11.30 |
1208번 : 부분수열의 합2 (0) | 2019.11.30 |
댓글