[문제풀이] 추석 트래픽
업데이트:
2018 Kakao Blind Recruitment 기출 문제
문제 링크 : 추석 트래픽
풀이 시간 : 40분
1. 문제 풀이
처음에 보면 0.001초 단위로 끊어서 몇개의 트래픽이 있는지 찾는 생각이 들지만
생각하면 요청 시간 및 응답 시간에서만 변화가 일어난다.
그래서 응답 시간에서 +1초 사이에 다른 요청 및 응답 시간이 있는지를 검사하면 된다.
1) 먼저 시간을 최소 단위인 초로 바꾼다. (계산 및 비교를 편하게 하기 위해서)
2) 입력이 응답 시간 오름차순으로 들어 오기 때문에 응답 시간을 사용
3) 기준 응답 시간에서 +1초 사이에 다른 요청 시간이나 응답 시간이 있는지 검색하여 최대값을 찾아준다.
2. 소스 코드
static public int solution(String[] lines) {
int answer = 0;
Line[] line = new Line[lines.length];
// 시간을 초단위 변환 및 요청 시간 및 응답 시간을 저장
for (int i = 0; i < line.length; i++) {
// 시 단위
double conv = Integer.parseInt(lines[i].substring(11,13))*3600;
// 분 단위
conv+=Integer.parseInt(lines[i].substring(14,16))*60;
conv+=Double.parseDouble(lines[i].substring(17,23));
double time = Double.parseDouble(lines[i].substring(24,lines[i].length()-1));
line[i] = new Line(conv-time+0.001,conv);
}
for (int i = 0; i < line.length; i++) {
int count = 1;
for (int j = i+1; j < line.length; j++) {
// 기준 응답 시간 + 1초에 요청 시간이나 응답 시간이 작으면 기준 응답 시간 ~ +1초 사이에 존재한다.
if(line[j].end<line[i].end+1 || line[j].start < line[i].end+1) {
count++;
}
// 기준이 되는 응답 시간에 1초 + 3초(최대 처리 시간)보다 큰 응답 시간을 가지면 요청 시간도 포함되지 않기 때문에
// 그 이후는 안해도 된다(응답 시간으로 정렬 되어 있기 때문)
else if(line[i].end+4<line[j].end) {
break;
}
}
answer = Math.max(count, answer);
}
return answer;
}
static class Line{
// 요청 시간 및 응답 시간
double start;
double end;
Line(double start, double end){
this.start=start;
this.end=end;
}
}
3. 주의
응답 완료 시간에서 처리 시간을 빼면 0.001초(최소 단위)를 더 빼기 때문에 0.001초를 더해야 한다.
4. 후기
속도 향상을 위해 아래 코드를 넣어 주었는데
else if(line[i].end+4<line[j].end) {
break;
}
4가 아닌 3으로 해서 계속 채점을 돌리면 3번 케이스가 틀렸다.
최대 처리 시간 + 1초를 해야 범위를 초과하는데
단순히 처리시간이 3초라고 하여 3을 썼다.