-
[프로그래머스]추석 트래픽_Java알고리즘문제풀이/프로그래머스 2021. 7. 31. 16:39
--문제--
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
--문제 접근--
문제를 봤을 때 이해하려고 노력했을대에 왜 0.001초가 빠지는지 고민해 봤을 때에
- 예를 들어, 로그 문자열 2016-09-15 03:10:33.020 0.011s은 "2016년 9월 15일 오전 3시 10분 33.010초"부터 "2016년 9월 15일 오전 3시 10분 33.020초"까지 "0.011초" 동안 처리된 요청을 의미한다. (처리시간은 시작시간과 끝 시간을 포함)
- 33.010~33.020이 왜 0.011초인지 생각해봤을 때에 10,11,12,13,14,15,16,17,18,19,20이라서 당연히 0.001초가 빠지는 것이었다.
그 이후 범위를 어떻게 정할 것인지 고민을 하였습니다.
1. 첫 번째 방법은 배열을 세워서 시간만큼을 다 카운트를 해서 제일 카운트 많이 된 곳이 최댓값이라 생각하였지만 이 방법은 비효율 적인 것 같아 다른 방법을 조금 더 생각했습니다.
2. 0.001초까지를 숫자로 변환을 해서 범위를 만들어 그 범위에 들어오는 트래픽을 카운트하는 방법을 생각했습니다.
그리하여 시간은 *3600000 분은* 60000 초는 * 1000 그 외는 그대로 더해주어서 숫자로 변환을 해줬습니다.
고려할 점은 위에서 봤던 것처럼 시간 처리를 할 때에 0.001를 빼줘야 한다는 점입니다.
package Level3; import java.util.Arrays; public class 추석트래픽 { public static void main(String[] args) { String[] temp= {"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 2.31s", "2016-09-15 21:00:00.966 0.381s", "2016-09-15 21:00:02.066 2.62s"}; System.out.println(solution(temp)); } public static int solution(String[] lines) { int answer = 0; String[][] temp=new String[lines.length][3]; //여기서 스플릿을 하는 이유는 날짜는 고려할 필요가 없기때문에 시간만을 고려하기 위해서 for(int i=0;i<lines.length;i++) { temp[i]=lines[i].split(" "); } String[][] temp1=new String[lines.length][4]; //이부분은 시간부분에서 시간 분 초 밀리세컨즈 단위로 나누기 위해서 사용하였습니다. for(int i=0;i<lines.length;i++) { temp1[i]=temp[i][1].split("\\:|\\."); } int[][] result=new int[lines.length][2]; //result[i][0]은 시간단위를 숫자로 변환한 부분 result[i][1]은 처리시간을 의미합니다. for(int i=0;i<lines.length;i++) { result[i][0]=Integer.parseInt(temp1[i][0])*3600000+Integer.parseInt(temp1[i][1])*60000+Integer.parseInt(temp1[i][2])*1000+Integer.parseInt(temp1[i][3]); result[i][1]=(int)(Float.parseFloat(temp[i][2].substring(0,temp[i][2].length()-1))*1000-1); } for(int i=0;i<lines.length;i++) { int tempV=0; int temp00=result[i][0]+999; for(int j=i;j<lines.length;j++) { if(temp00>=result[j][0]-result[j][1]) { tempV++; } } answer=Integer.max(tempV, answer); } return answer; } }
'알고리즘문제풀이 > 프로그래머스' 카테고리의 다른 글
[프로그래머스]리틀프렌즈사천성_Java (0) 2021.08.01 [프로그래머스]가장먼노드_Java (0) 2021.07.31 [프로그래머스]H-Index_Java (0) 2021.07.31 [프로그래머스]내적_Java (0) 2021.07.31 [프로그래머스]로또의 최고 순위와 최저 순위 (0) 2021.07.31