[프로그래머스] 추석 트래픽 (java)
코딩테스트 연습 - [1차] 추석 트래픽 | 프로그래머스 (programmers.co.kr)
어떻게 생각하고 문제를 풀었는가?
1초 간 처리하는 요청의 수를 구하기 위해서는 모든 요청시간과 완료시간을 기억해야 합니다.
주어진 문자열에서 완료시간을 파싱하여 기억하고, 요청 처리시간으로부터 요청 시간을 알아낼 수 있습니다.
각 초마다 요청의 수를 확인할 수도 있지만 요청이 완료된 후의 시간에서는 요청이 완료되기 전의 시간보다 요청량이 하나 더 적다는 것을 생각할 수 있습니다.
주어진 입력 문자열들은 처리 완료시간이 빠른 순서대로 주어집니다.
따라서 앞 인덱스의 요청 처리완료시간은 뒤 인덱스의 처리완료시간보다 빠르다는 정보를 미리 알 수 있으며, 각 로그의 처리완료시간 1초 내에 주어진 요청시간의 수의 최대 값을 확인함으로써 초당 최대 처리량을 구할 수 있습니다.
코드
import java.util.*;
import java.text.SimpleDateFormat;
class Solution {
final String DATE_FORMAT = "HH:mm:ss.SSS";
SimpleDateFormat dateformat = new SimpleDateFormat(DATE_FORMAT);
public int solution(String[] lines) {
Process[] processes = new Process[lines.length];
for(int i=0; i<lines.length; i++){
String[] values = lines[i].split(" ");
processes[i] = new Process(values[1],values[2]);
}
int answer = 0;
for(int i=0; i<processes.length; i++){
int count=1;
Date end_time = processes[i].end;
for(int j=i+1; j<processes.length; j++){
if(processes[j].isOverlap(end_time)) count++;
}
if(answer < count) answer = count;
}
return answer;
}
class Process{
Date start;
Date end;
Process(String end_str, String process_str){
try{
this.end = dateformat.parse(end_str);
long process_time = (long)(Float.valueOf(process_str.substring(0,process_str.length()-1))*1000);
this.start = new Date(this.end.getTime() - process_time+1);
}catch(Exception e){
e.printStackTrace();
}
}
boolean isOverlap(Date date){
return (this.start.getTime() - date.getTime()) < 1000;
}
}
}
문자열로부터 시간 정보를 구하기 위해 SimpleDateFormat을 사용하였습니다.
모든 로그의 응답완료시간은 2016-09-15 hh:mm:ss.sss로 주어져 있습니다.
Year, Month, Day과 같은 정보는 사용할 필요가 없으므로 Hour, Minute, Second만을 'HH:mm:ss.SSS'의 포맷으로 파싱하였습니다.
Year, Month, Day의 값들은 SimpleDateFormat에 의해 GregorianCalendar에서 지정한 기본값인 1970-01-01로 저장됩니다.
Date의 getTime 메서드는 millisecond 단위로 값을 반환합니다. 이를 이용하여 시작시간을 계산하고 초당 요청량을 계산하였습니다.