문제
이번 추석에도 시스템 장애가 없는 명절을 보내고 싶은 어피치는 서버를 증설해야 할지 고민이다. 장애 대비용 서버 증설 여부를 결정하기 위해 작년 추석 기간인 9월 15일 로그 데이터를 분석한 후 초당 최대 처리량을 계산해보기로 했다. 초당 최대 처리량은 요청의 응답 완료 여부에 관계없이 임의 시간부터 1초(=1,000밀리초)간 처리하는 요청의 최대 개수를 의미한다.
풀이
일단 String 형태를 hh:mm:ss.SSS 형태로 분석해서 시간을 저장해야한다.
이렇게 저장된 시간을 기준으로
현재 기준로그의 시작시간 - 1Sec + 0.001 < 비교 로그의 끝시간 && 현재 기준로그의 시작시간 >= 비교 로그의 시작시간
이 기준이 성립되면 현재 로그에서 1초내에 동시에 처리해야하는 작업이 된다.
시간계산의 편의를 위해서 double 형태를 1000을 곱한 int 형태로 처리하였다.
<전체코드>
import java.util.*;
import java.io.*;
class Solution {
static class work{
double start;
double end;
double time;
work(double time){
this.time = time;
}
}
public int solution(String[] lines) {
int answer = 1;
work[] list = new work[lines.length];
for(int i = 0 ; i < lines.length ; i++){
lines[i] = lines[i].replaceAll("2016\\-09\\-15\\s","");
String[] div = lines[i].split("\\s");
div[1] = div[1].replace("s","");
work w = new work(Double.parseDouble(div[1]) * 1000);
String[] time = div[0].split(":");
double timetotal = 0;
for(int j = 0 ; j < time.length ; j++){
double n = Double.parseDouble(time[j]);
n *= Math.pow(60, 2 - j);
timetotal += n;
}
w.end = timetotal * 1000;
w.start = (timetotal * 1000) - w.time + 1;
list[i] = w;
}
for(int i = 0 ; i < list.length ; i++){
work w = list[i];
int start = (int)w.start;
int oneSecBefore = start - 1000;
int count = 1;
for(int j = 0 ; j < list.length; j++){
if(i == j)
continue;
if(list[j].end > oneSecBefore && list[j].start <= start)
count++;
}
answer = Math.max(answer, count);
}
return answer;
}
}
'자료구조 공부 > String' 카테고리의 다른 글
[프로그래머스] 광고삽입** (0) | 2021.05.25 |
---|---|
[프로그래머스] 셔틀버스 (0) | 2021.05.23 |
[프로그래머스] 불량사용자 (0) | 2021.05.11 |
[프로그래머스] 튜플 (0) | 2021.05.10 |
[프로그래머스] 수식 최대화 - 순열 완전탐색 (0) | 2021.05.07 |