2017년 카카오 blind 코딩 테스트 - 추석 트래픽 python
출처 : https://programmers.co.kr/learn/courses/30/lessons/17676
문제 풀이
이번 문제는 트래픽의 시작 시간과 종료 시간을 확인하고, 최대 몇 개가 겹쳐지는 반환하는 문제 입니다.
입력 데이터를 먼저 보면
[ “2016-09-15 01:00:04.001 2.0s”, “2016-09-15 01:00:07.000 2s”]
문자열 파싱을 통해서 날짜는 떼내고, 종료 시간과 처리된 시간을 분리해서 시작 시간을 구합니다.
자 그리고 트래픽의 시작 시간과 종료 시간을 dictionary에 저장하고선 시작 시간으로 정렬을 합니다.
문제를 풀기 위해서는 state와 history를 만듭니다. state는 트래픽이 동작 중인지를 관리하는 배열이고, 시작 시간에 켜졌고, 종료 시간에 꺼집니다. history는 state를 보고 트래픽이 몇 개가 동작 중인지 보면, 지금 몇 개가 겹쳤구나를 알 수 있겠죠. 그럼 이 history에서 maximum 값을 반환하면 문제는 풀립니다.
[1] 들어오는 배열에서 enumerate를 통해서 index를 받아와 트래픽을 식별합니다. dictionary내에서 시작시간과 종료시간이 어떤 트래픽인지 알게됩니다.
[2] 들어오는 입력을 split을 이용해 공백으로 분리하고 그 중에서 종료 시간(time)과 처리된 시간(duration)을 이용해 시작 시간을 구합니다. 이 때 종료 시간은 시, 분, 초 이므로 split(‘:’)으로 분리하고 초 단위로 계산합니다(60*60*시 + 60*분 + 초). 다음으로 종료 시간에서 처리된 시간을 빼버리면 시작 시간입니다.
end = int(h) * 60 * 60 + int(m) * 60 + float(n)
duration = float(duration[:-1]) # 뒤에서 s 제거
그러나! 지문을 읽어보면
예를 들어, 로그 문자열 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.020초 - 0.011이면 33.009인데 왠 33.010(?)
자 그래서 우선 0.001을 더해야지 지문대로 나옵니다.
시작 시간과 종료 시간을 이용해서 시작과 종료되는 시간마다 트래픽이 몇 개가 겹쳐지는 지 확인 할 것 입니다. 그러나 그 순간을 계산하는 것이 아니라, 우리가 원하는 것은 1초 구간의 처리량입니다. 이 1초라는 구간을 생각하면서 코드로 구현하는 것은 복잡합니다. 편하게 시작 시간을 1초가 안되게 늘려주면 되죠.
그래서 최종 시작 시간은 start = end - duration + 0.001 - 0.9991 정도로 줬습니다.
0.999시에는 테스트 케이스 1개(서로 다른 트래픽의 시작과 종료시간이 정확히 겹쳐질때)가 오답이 발생되어 0.0001을 더 주었습니다.
[3] 시작 시간과 종료 시간을 관리하는 dictionary에 키로 넣어주고 트래픽을 식별할 수 있도록 index를 값으로 넣습니다.
테스트 3의 time_table : {3601.0029000000004: 0, 3604.001: 0, 3604.0019: 1, 3607.0: 1}
0번 트래픽의 시작은 3601 종료는 3604 이구나를 알 수 있죠.
[4] 시간 순대로 정렬을 하기 위해서 sorted()를 사용하여 시간을 가져옵니다.
[5] 가져온 시간대로 state라는 트래픽의 개수만큼 배열을 이용해서 트래픽이 들어온 상태라는 것을 표시합니다.
테스트 케이스 5번에 대해서 state, time, state.count(1) 다음과 같이 나옵니다. 트래픽 10개에 대해서 시작 시간과 종료 시간 2번(*2)에 따라 총 20번이 출력되었죠. 문제 설명에 따라 겹쳐지는 1들이 보이죠? 1을 카운트하면 그 순간 겹쳐지는 트래픽의 개수를 셀 수 있습니다.
[0, 1, 0, 0, 0, 0, 0, 0, 0, 0] 75596.0539 1
[1, 1, 0, 0, 0, 0, 0, 0, 0, 0] 75596.07190000001 2
[1, 1, 1, 0, 0, 0, 0, 0, 0, 0] 75596.5009 3
[1, 1, 1, 1, 0, 0, 0, 0, 0, 0] 75596.6489 4
[1, 1, 1, 1, 1, 0, 0, 0, 0, 0] 75597.1809 5
[0, 1, 1, 1, 1, 0, 0, 0, 0, 0] 75597.421 4
[0, 1, 1, 1, 1, 0, 0, 1, 0, 0] 75597.43990000001 5
[0, 1, 1, 1, 1, 1, 0, 1, 0, 0] 75597.99990000001 6
[0, 1, 1, 1, 1, 1, 1, 1, 0, 0] 75598.16189999999 7
[0, 0, 1, 1, 1, 1, 1, 1, 0, 0] 75598.233 6
[0, 0, 0, 1, 1, 1, 1, 1, 0, 0] 75598.299 5
[0, 0, 0, 1, 1, 1, 1, 1, 0, 1] 75598.44790000001 6
[0, 0, 0, 0, 1, 1, 1, 1, 0, 1] 75598.688 5
[0, 0, 0, 0, 1, 1, 1, 1, 1, 1] 75599.58690000001 6
[0, 0, 0, 0, 0, 1, 1, 1, 1, 1] 75599.591 5
[0, 0, 0, 0, 0, 0, 1, 1, 1, 1] 75600.464 4
[0, 0, 0, 0, 0, 0, 0, 1, 1, 1] 75600.741 3
[0, 0, 0, 0, 0, 0, 0, 0, 1, 1] 75600.748 2
[0, 0, 0, 0, 0, 0, 0, 0, 0, 1] 75600.966 1
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 75602.066 0
[6] 위의 결과를 트래픽이 겹쳐지는 횟수인 state.count(1)를 history에 저장하고 max(history) 면 정답입니다.
'Algorithm' 카테고리의 다른 글
graph shortest path - 최단 경로 다익스트라 알고리즘 python (0) | 2019.09.27 |
---|---|
2017년 카카오 blind 코딩 테스트 - 뉴스 클러스터링 python (0) | 2019.09.25 |
Queue 큐 python (0) | 2019.09.23 |
codility - binary gap python (0) | 2019.09.22 |
2018년 카카오 blind 코딩 테스트 - 길 찾기 게임 python (0) | 2019.09.21 |