하루에 한 문제
[프로그래머스 2018 KAKAO BLIND RECRUITMENT] 추석 트래픽 -Java 본문
https://programmers.co.kr/learn/courses/30/lessons/17676
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
class Solution {
public int solution(String[] lines) {
int answer = 0;
Date [] start = new Date[lines.length];
Date [] end = new Date[lines.length];
SimpleDateFormat sdf = new SimpleDateFormat("yy-MM-dd HH:mm:ss.SSS");
for(int i=0; i<lines.length; i++) {
try {
String line[]=lines[i].split(" ");
end[i]=sdf.parse(line[0]+" "+line[1]); //처리 끝나는시간
int procMilli = (int) (Double.parseDouble(line[2].substring(0, line[2].length()-1)) * -1000);
start[i] = addMilli(end[i], procMilli + 1);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
for(int i=0; i<lines.length; i++) {
long startResopnse = end[i].getTime();
long endResponse = addMilli(end[i], 1000).getTime();
int cnt=0;
for(int j=0; j<lines.length; j++) {
long compareStart=start[j].getTime();
long compareEnd=end[j].getTime();
if(
((startResopnse-compareStart)<=0 && (endResponse-compareStart)>0) //기준작업끝나는 시간보다 늦게 시작하고, +1초보다 빨리 시작
|| ((startResopnse-compareEnd)<=0 && (endResponse-compareEnd)>0) //기준 작업끝나는 시간보다 늦게 끝나고, +1초보다 빨리 끝남
|| ((startResopnse-compareStart) >0 && (startResopnse-compareEnd) <=0) //기준작업 끝나는 시간보다 빨리 시작하고, 기준작업 긑나는 +1 시간보다 늦게 끝남
) {
cnt++;
}
}
answer =Math.max(cnt, answer);
}
return answer;
}
private Date addMilli(Date date, int procMilli) {
Calendar c = Calendar.getInstance();
c.setTime(date);
c.add(Calendar.MILLISECOND, procMilli);
return c.getTime();
}
}
소요시간 : 2시간 25분
시간을 다루기 위해 SimpleDateFormat, Date, Calendar에 대해 공부하면서 푼다고 좀 오래 걸렸습니다.
일단 문제를 읽어보면 작업의 시작 시간, 끝나는 시간이 필요하다는 것을 눈치채셨을꺼라 생각합니다.
데이터 입력처리
1. 입력이 들어오면 SimpleDateFormat으로 형태를 만든다.
2. parse를 이용해 Date형태로 바꿔 끝나는 시간을 저장한다.
3. Calendar.add() 를 통해 끝나는시간 - 소요시간을 해서 시작시간을 구해줍시다.
-Calendar.add() 안에서 형태를 지정하고 시간을 더하거나 뺄 수 있습니다.
자 데이터 입력을 다 처리했다면 문제를 어떻게 풀 지 생각해봅시다.
문제의 조건을 만족하기 위해서는 어떤 경우의 수가 있는지 확인해봅시다.
그림에서 보듯이 여러가지 경우의 수가 있지만 3개의 경우의 수가 있다면 다 포함 가능합니다.
1. end 보다 늦게 시작하지만 end+1 보다 빨리 시작한다. (2, ,4 ,5 ,6)
2. end 보다 늦게 끝나지만 end+1 보다는 빨리 끝난다. (3)
3. end 보다 빨리 시작하고, end+1보다 늦게 끝난다 ( 1 )
현재 end, start에 들어있는 값을 빼서 Date.getTime() 을 통해 밀리세컨드로 바꿔줍니다.
그 후 저 위의 경우의 수 3개를 만족하면 cnt를 갱신하며 최대값을 비교합니다!
위에서 구한 경우의 수를 코드로 옮겨주기만 하면 됩니다!
끝~
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스 월간 코드 챌린지 시즌1] 쿼드압축 후 개수 세기 -Java (0) | 2021.04.13 |
---|---|
[프로그래머스 2020 KAKAO BLIND RECRUITMENT] 가사 검색 -Java (0) | 2021.04.10 |
[프로그래머스 2019 KAKAO BLIND RECRUITMENT] 길 찾기 게임 -Java (0) | 2021.04.08 |
[프로그래머스] 줄 서는 방법 -Java (0) | 2021.04.07 |
[프로그래머스 2019 카카오 개발자 겨울 인턴십] 징검다리 건너기 -Java (0) | 2021.04.06 |