Post

Programmers_2018 KAKAO BLIND RECRUITMENT [1차] 추석 트래픽(python)

프로그래머스 -추석 트래픽 문제 입니다.

1. 문제

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


2. 분류 및 난이도

Programmers 문제입니다.
KAKAO BLIND RECRUITMENT(2018) - [1차] 문제입니다.

Level 3난이도의 문제입니다.


3. 생각한 것들(문제 접근 방법)

  • 처음 풀어본 KAKAO LEVEL3문제입니다.
  • python의 datetime 라이브러리를 사용하였습니다.
  • 구간 설정 하는데에 시간을 많이 썼는데 결과적으로 모든 line을 돌면서 line마다의 끝 시간 + 1초 구간을 정해 카운트를 세줘야합니다.
  • 예제 2에서 힌트를 얻었는데, 왜 인지는 모르겠습니다.
  • 문제에서 1초는 시작 시간과 끝 시간을 포함합니다.
  • 즉 5초의 1초는 5:000s ~ 5.999s입니다.

4. 접근 방법을 적용한 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# 자료구조 꺼내를 빠르게 하기 위함.
from collections import deque
# datetime은 시간라이브러리, timedelta는 시간 연산을 위한 라이브러리 같습니다.
from datetime import datetime,timedelta
def solution(lines):
    answer = 0
    dq = []
    # compare은 가장 빨리 끝나는 line을 저장합니다.
    compare = datetime(2018,1,1,1,1,1)
    # last는 가장 늦게 끝나는 line을 저장합니다.
    last = datetime(2014,1,1,1,1,1)
    # line을 돌면서 시간에 대해 전처리를 해준 뒤 리스트에 넣습니다.
    for i in range(len(lines)):
        # "-"로 먼저 구분합니다.
        year,mon,day = lines[i].split("-")
        day,mod,query = day.split(" ")
        # 끝의 s를 제거
        query = query[:-1]
        querys = query.split(".")
        queryms =  0
        # 2.0s와 2s를 동일하게 여겨야합니다. 또한, 2.321s같이 들어올 경우 마이크로 초를 구분해줘야합니다.
        # 연산이 이렇게 되는 이유는 기본적으로 timedate에서 제공하는 microseconds의 범위는 0 ~ 100000입니다. 문제에서는 소수점 3자리까지만 나타내므로 전처리를 해줘야합니다.
        if len(querys) > 1 : 
            queryms = int(querys[1]) * 1000000  //(10**len(querys[1]))
        querys = int(querys[0])
        h,m,s = mod.split(":")
        s,ss = s.split(".")
        # end는 line으로 들어온 값입니다.
        end = datetime(int(year),int(mon),int(day),int(h),int(m),int(s),int(ss)*1000)
        # 제일 늦게끝난 것은 last에 빨리 끝난 것은 compare에 저장합니다.
        if end > last : 
            last = end
        if compare > end : 
            compare =end
        # start는 위에서 전처리해준 T값을 빼준 시간입니다.
        start = end - timedelta(seconds = querys, microseconds = queryms) + timedelta(microseconds=1000)
        # 리스트에 넣습니다.
        dq.append((start,end))
    # 리스트를 돌 것인데, 정렬되어있지 않으므로 전부 두 번씩 돌아줍니다.
    for s,e in dq :
        count = 0
        compare = e
        for s,e in dq : 
            # 만약 범위를 벗어났으면 continue합니다.
            if compare > e or  compare + timedelta(microseconds = 999000) < s:
                continue
            else:
                count+=1
                
        answer = max(answer,count)
                
    return answer

5. 결과

필요시. c++ 짜드리겠습니다. 설명이 필요시 댓글달아주세요.

This post is licensed under CC BY 4.0 by the author.