[자바][프로그래머스] 추석 트래픽 간단 풀이
프로그래밍/알고리즘2021. 1. 9. 00:44
코딩테스트 연습 - [1차] 추석 트래픽 | 프로그래머스 (programmers.co.kr)
위의 문제에 대한 코드입니다.
풀고나서 생각해보니 이 문제는 String으로 주어진 데이터를 파싱하기가.. 좀 귀찮아서 그렇지
핵심 원리만 알면 생각보다 단순한 문제였습니다.
이산 데이터가 아닌.. 연속된 데이터를 처리해야하는 문제 같아서 머리가 아팠습니다.
그런데 잘 생각해보면.. 시작시간과 종료시간만 이용하면 되고.. 그 중간 시간은 사용할 필요가 없었습니다.
파싱을 할 때 Date와 SimpleDateFormat을 쓸 수도 있는데 레거시 클래스라
일부러 ZoneDateTime을 써봤습니다.
코드가 그렇게 깔끔하진 않지만 참고차 올려봅니다.
import java.util.*;
import java.time.*;
import java.time.format.DateTimeFormatter;
import javafx.util.*;
class Solution {
public int solution(String[] lines) {
int answer = 1;
List<Long> s_list = new ArrayList<>();
List<Long> e_list = new ArrayList<>();
for (String s : lines) {
int n = s.length();
int index = s.lastIndexOf(" ");
String responseTime = s.substring(0, index);
String duration = s.substring(index+1, n-1);
Pair<Long, Long> p = getIncludedTime(responseTime, duration);
s_list.add(p.getKey());
e_list.add(p.getValue());
}
int n = s_list.size();
for (int i=0; i<n-1; i++) {
long end_time = e_list.get(i);
long start_time = s_list.get(i);
int cnt = 1;
for (int j=i+1; j<n; j++) {
long s = s_list.get(j);
long e = e_list.get(j);
//System.out.println("end_time = " + end_time +", s = " + s + ", e = " + e);
if (Math.abs(end_time-s) < 1000 || Math.abs(end_time-e) < 1000
|| Math.abs(start_time-s) < 1000 || Math.abs(start_time-e) < 1000
|| start_time <= s && e <= end_time
|| s <= start_time && end_time <= e
) {
cnt++;
}
}
answer = Math.max(answer, cnt);
}
return answer;
}
public Pair<Long, Long> getIncludedTime(String responseTime, String duration) {
float d = Float.parseFloat(duration);
ZonedDateTime zdt = LocalDateTime.parse(responseTime, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS" , Locale.US ))
.atZone(ZoneId.of( "Asia/Seoul" ));
//System.out.println(zdt);
ZonedDateTime zdt_end = zdt;
long long_end = zdt_end.toInstant().toEpochMilli();
long long_start = (long_end-(long)(d*1000-1));
/*
System.out.println(" " + long_start);
System.out.println(" " + long_end);
System.out.println(" " + (long)(d*1000-1));
*/
return new Pair<>(long_start, long_end);
}
}
O(nlogn) 코드는 아래의 포스팅을 참고해주세요(c++)
댓글 영역