문제
이번 추석에도 시스템 장애가 없는 명절을 보내고 싶은 어피치는 서버를 증설해야 할지 고민이다. 장애 대비용 서버 증설 여부를 결정하기 위해 작년 추석 기간인 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
1
입력 2
[
"2016-09-15 01:00:04.002 2.0s",
"2016-09-15 01:00:07.000 2s"
]
출력 2
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"
]
출력 3
7
접근
이미 도착순으로 정렬된 상태의 배열이 주어지기 때문에,
그 응답완료 시간 에서 +1초 -0.001초 하고
다음 배열에 있는 응답 완료 시간에서 - 처리시간 +0.001초를 합니다.
두 시간을 빼서 0이상이라면, 두 시간이 겹치는 것으로 간주합니다.
이렇게 모든 점을 n^2만큼 돌면서 최대값을 찾아줍니다.
코드
import java.util.*;
class Date implements Comparable<Date>{
int hour;
int min;
int sec;
int time;
public Date(int hour, int min, int sec,int time){
this. hour = hour;
this. min = min;
this. sec = sec;
this. time = time;
}
public int compareTo(Date o1){
if(this.min == o1.min && this.hour == o1.hour){
return this.sec - o1.sec;
}
if(this.hour == o1.hour){
return this.min - o1.min;
}
return this.hour - o1.hour;
}
}
class Solution {
public int solution(String[] lines) {
int answer = 0;
ArrayList<Date> list = new ArrayList<>();
for(int i=0; i<lines.length; i++){
StringTokenizer st = new StringTokenizer(lines[i],": ");
st.nextToken();
int hour = Integer.parseInt(st.nextToken())*60*60*1000;
int min = Integer.parseInt(st.nextToken())*60*1000;
double sec = Double.parseDouble(st.nextToken())*1000;
int realSec = (int)sec;
String s = st.nextToken();
s = s.substring(0,s.length()-1);
double time = Double.parseDouble(s)*1000;
int realTime = (int)time;
list.add(new Date(hour, min, realSec, realTime));
}
int result = 0;
//리스트를 순서대로 돌면서 차이 체크!
for(int i=0; i<list.size(); i++){
Date now = list.get(i);
int max = 1;
int nowTime = now.hour + now.min + now.sec+1000-1;
for(int j=i+1; j<list.size(); j++){
Date now2 = list.get(j);
int temp=0;
int nextTime = now2.hour + now2.min + now2.sec - now2.time+1;
temp = nowTime - nextTime;
//겹친다는 뜻
if(temp >= 0){
max++;
}
}
result = Math.max(result,max);
}
return result;
}
}
주의
double을 그대로 사용하면 오차가 발생해서 값이 이상해짐...
'공부 정리 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 합승 택시 요금 (0) | 2022.06.08 |
---|---|
[프로그래머스] 배달 자바 (0) | 2022.06.07 |
[프로그래머스] 자바 H-Index (0) | 2022.04.14 |
[프로그래머스] 자바 자물쇠와 열쇠 (0) | 2022.03.29 |
[프로그래머스] 자바 카펫 (0) | 2022.02.21 |
댓글