하루에 한 문제

[프로그래머스 2018 KAKAO BLIND RECRUITMENT] 추석 트래픽 -Java 본문

알고리즘/프로그래머스

[프로그래머스 2018 KAKAO BLIND RECRUITMENT] 추석 트래픽 -Java

dkwjdi 2021. 4. 9. 17:14

https://programmers.co.kr/learn/courses/30/lessons/17676

 

코딩테스트 연습 - [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

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를 갱신하며 최대값을 비교합니다!

위에서 구한 경우의 수를 코드로 옮겨주기만 하면 됩니다!

 

끝~

Comments