알고리즘 공부/프로그래머스
(Java)프로그래머스 코딩테스트 연습 - 2018 KAKAO BLIND RECRUITMENT - [1차] 추석 트래픽
HRuler
2020. 12. 14. 19:59
1. 문제
https://programmers.co.kr/learn/courses/30/lessons/17676?language=java
코딩테스트 연습 - [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-15 21:00:00.748
programmers.co.kr
2. 나의 풀이
import java.util.*;
class Solution {
private class log{
String date;
float start;
float end;
public log(String date, float start, float end) {
this.date = date;
this.start = start;
this.end = end;
}
}
public int solution(String[] lines) {
int answer = 0;
ArrayList<log> arr = new ArrayList<>();
for(String str : lines) {
//처리 시간을 숫자 형태로 바꾸기 위한 처리
str = str.replace("s", "");
//공백을 기준으로 문자열을 나누는 처리
String [] str_arr = str.split(" ");
//배열의 첫 번째 인덱스를 date에 저장
String date = str_arr[0];
//끝난 시간을 :를 기준으로 나누는 처리
String [] time_arr = str_arr[1].split(":");
//종료 시간을 실수 형태로 변환
float end = (Float.parseFloat(time_arr[0]) * 3600) + (Float.parseFloat(time_arr[1]) * 60) + (Float.parseFloat(time_arr[2]));
//종룔 시간에 처리 시간을 빼내어 시작 시간을 구하는 처리
float start = end - Float.parseFloat(str_arr[2]) + (float)0.001;
//System.out.println("date : " + date + ", start : " + start + ", end : " + end);
//리스트에 넣는 처리
arr.add(new log(date, start, end));
}
//끝난 시간 -> 시작 시간 우선 순위 순으로 정렬
Collections.sort(arr, new Comparator<log>() {
@Override
public int compare(log o1, log o2) {
if(o1.end == o2.end) {
if(o1.start < o2.start) {
return -1;
}else {
return 1;
}
}else if(o1.end < o2.end) {
return -1;
}else {
return 1;
}
}
});
for(int i = 0, outter = arr.size(); i < outter; i = i + 1) {
log gijun = arr.get(i);
//종료 시간 기준으로 1초 뒤의 시간을 구하는 처리
float range = gijun.end + (float)0.999;
int cnt = 0;
for(int j = i, inner = arr.size(); j < inner; j = j + 1) {
log next = arr.get(j);
//비교하려는 시작 시간이 기준보다 작을 경우
if(range >= next.start) {
cnt++;
}
}
if(answer < cnt) {
answer = cnt;
}
}
return answer;
}
}
3. 다른 사람 풀이
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
public class Solution {
public int solution(String[] lines) {
int answer = 0;
List<Long> checkPointList = new ArrayList<Long>();
List<Log> logList = new ArrayList<Log>();
for (String line : lines) {
Log log = new Log(line);
checkPointList.add(log.getStart());
checkPointList.add(log.getEnd());
logList.add(log);
}
Collections.sort(checkPointList);
int top = 0;
for(int i = 0; i < checkPointList.size(); i++) {
int count = 0;
for (Log log : logList) {
if(log.isIn(checkPointList.get(i), checkPointList.get(i) + 999)) {
count++;
}
}
if(count > top) {
top = count;
}
}
answer = top;
return answer;
}
class Log {
private long start = 0;
private long duration = 0;
private long end = 0;
public Log(String line) {
String[] split = line.split(" ");
String dateString = split[0] + " " + split[1];
try {
Date startDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").parse(dateString);
this.end = startDate.getTime();
String[] split2 = split[2].split("s");
double parseDouble = Double.parseDouble(split2[0]);
this.duration = (long) (parseDouble * 1000);
this.start = this.end - this.duration;
} catch (Exception e) {
e.printStackTrace();
}
}
public boolean isIn(long checkPointStart, long checkPointEnd) {
if(this.end < checkPointStart || this.start >= checkPointEnd) {
return false;
} else
return true;
}
public long getStart() {
return start;
}
public void setStart(long start) {
this.start = start;
}
public long getDuration() {
return duration;
}
public void setDuration(long duration) {
this.duration = duration;
}
public long getEnd() {
return end;
}
public void setEnd(long end) {
this.end = end;
}
}
}