[알고리즘] 프로그래머스 - 추석 트랙픽

June·2021년 8월 21일
0

알고리즘

목록 보기
239/260

2018 카카오 1차

내 풀이

def solution(lines):
    start_times = []
    end_times = []
    answer = 0

    for line in lines:
        end_time_in_ms, start_time_in_ms = getStartAndEndTime(line)

        start_times.append(start_time_in_ms)
        end_times.append(end_time_in_ms)

    for i in range(len(lines)):
        cnt = 0
        cur_end_time = end_times[i]
        # i번째는 현재 자신의 시작시간이고, i 이하는 그 이전의 시작시간이므로 카운트 할 필요가 없다.
        for j in range(i, len(lines)):
            if cur_end_time > start_times[j] - 1000:
                cnt += 1
        answer = max(answer, cnt)

    return answer


def getStartAndEndTime(line):
    day, done_time, take_time = line.split(" ")
    hour, minute, second = done_time.split(":")
    second, milli_second = second.split(".")
    
    end_time_in_ms = int(hour) * 60 * 60 * 1000
    end_time_in_ms += int(minute) * 60 * 1000
    end_time_in_ms += int(second) * 1000
    end_time_in_ms += int(milli_second)
    
    spent_time_in_ms = float(take_time[:-1])
    spent_time_in_ms = int(spent_time_in_ms * 1000)
    start_time_in_ms = end_time_in_ms - spent_time_in_ms + 1
    
    return end_time_in_ms, start_time_in_ms

겁을 엄청 먹었었지만 생각보다는 어렵지 않은 문제였다.
카카오에서는 문자열 로그를 다루는 문제가 자주 나온다고한다. split을 사용했지만, 정말로 형식이 고정되어있으면 슬라이싱으로 가져오는 것도 좋을 것이다.

시간을 가져온다음 찍어볼 때 너무 긴 문자열이 나와서 ms로 바꾸는 것이 아닌가 싶었는데, 문자열 * 60 * 60 * 1000을 하니 엄청 긴 문자열이 나온 것이었다. 숫자로 바꾸고 곱했어야 했다.

어떤 시간을 나타내는 막대들이 주어지고 겹치는 것들을 확인하는 것을 task schedulling problem라고 하는 것 같다. 이 부분에서 조금 겁을 먹었는데 문제를 잘 읽으면 되는거였다. 특정 시간에서 1초 내에 처리된 최대 개수를 구하는 것이 문제다. 그러니 각 끝난 시간들에서, 1초내에 진행중인 작업들이 몇개인지 파악하면 된다.

0개의 댓글