이번 추석에도 시스템 장애가 없는 명절을 보내고 싶은 어피치는 서버를 증설해야 할지 고민이다. 장애 대비용 서버 증설 여부를 결정하기 위해 작년 추석 기간인 9월 15일 로그 데이터를 분석한 후 초당 최대 처리량을 계산해보기로 했다. 초당 최대 처리량은 요청의 응답 완료 여부에 관계없이 임의 시간부터 1초(=1,000밀리초)간 처리하는 요청의 최대 개수를 의미한다.
입력되는 시간의 경우 모두 초 단위로 환산한다.
환산한 응답시간 - 처리시간 + 1 (끝시간을 포함하기 때문에 1을 더함)을 통해 시작시간을 계산한다.
계산된 시작시간과 응답시간을 기준으로 윈도우를 생성하여 최대값을 계산한다.
import java.util.*;
class Solution {
public int solution(String[] lines) {
int answer = 0;
Arrays.sort(lines);
ArrayList<int[]> al = new ArrayList<>();
for (int i = 0; i < lines.length; i++) {
String line = lines[i];
String[] times = line.split(" ");
String[] s = times[1].split(":");
int t = (int) (Double.parseDouble(times[2].substring(0, times[2].length() - 1)) * 1000); // 처리시간 t
// 응답 완료시간
int endTime = 0;
endTime += Integer.parseInt(s[0]) * 3600 * 1000;
endTime += Integer.parseInt(s[1]) * 60 * 1000;
endTime += (int) (Double.parseDouble(s[2]) * 1000);
int startTime = endTime - t + 1;
int[] temp = new int[2];
temp[0] = startTime;
temp[1] = endTime;
al.add(temp);
}
//각 로그의 시작과 끝을 기준으로 윈도우를 설정하고 최대값을 구한다.
for (int i = 0; i < al.size(); i++) {
int startMax = 0;
int endMax = 0;
int start = al.get(i)[0];
int end = al.get(i)[1];
for (int j = 0; j < al.size(); j++) {
int targets = al.get(j)[0];
int targete = al.get(j)[1];
if (start <= targete && start + 999 >= targets)
startMax++;
if (end <= targete && end + 999 >= targets)
endMax++;
}
answer = Math.max(answer, startMax);
answer = Math.max(answer, endMax);
}
return answer;
}
}
혼자서 최대한 풀어볼려고 시간을 많이 끌었다. 처음에 시간을 초 단위로 환산하는 생각을 못해서.. 삽집을 오래했다 풀고나면 어렵지 않게 느껴지는데 문제를 풀 때는 진짜 어떻게 해야하나 고민도 많이하고 시행착오도 많이 겪었다.
너무 기초지만, 자료형으로 변환하는 과정에서 값이 날라갈 수도 있으니까, 그 부분도 꼭 체크할 것...
풀 땐 힘들었지만 성장의 과정이라고 생각한다.
출처 : https://programmers.co.kr/learn/courses/30/lessons/17676