일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 17장
- 9장
- 1300번
- java
- 2156번
- Design Patterns
- BOJ
- 클린코드
- springboot
- Spring
- 코딩 테스트
- 11286번
- java의 정석
- DxTrace
- Adapater Pattern
- 2206번
- 가장 긴 증가하는 부분 수열2
- 프로그래머스
- Design Pattern
- 1043번
- 자바의 정석
- SerialDate 리펙터링
- 코딩테스트
- programmers
- Dxerr.h
- 백준
- 2166번
- 10830번
- 냄새와 휴리스틱
- 11758번
- Today
- Total
Don't give up!
[프로그래머스] 추석 트래픽 (java) 본문
코딩테스트 연습 - [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 단위로 값을 반환합니다. 이를 이용하여 시작시간을 계산하고 초당 요청량을 계산하였습니다.
'Coding Test > Programmers' 카테고리의 다른 글
[프로그래머스] 표 편집 (java) (0) | 2021.07.13 |
---|---|
[프로그래머스] 불량 사용자 (java) (0) | 2021.06.24 |
[프로그래머스] N-Queen (java) (0) | 2021.06.23 |