Don't give up!

[프로그래머스] 추석 트래픽 (java) 본문

Coding Test/Programmers

[프로그래머스] 추석 트래픽 (java)

Heang Lee 2021. 6. 25. 18:22

코딩테스트 연습 - [1차] 추석 트래픽 | 프로그래머스 (programmers.co.kr)

 

코딩테스트 연습 - [1차] 추석 트래픽

입력: [ "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-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 단위로 값을 반환합니다. 이를 이용하여 시작시간을 계산하고 초당 요청량을 계산하였습니다.