본문 바로가기
알고리즘

2018 카카오 신입 공채 1차 블라인드 코딩테스트 문제 07

by Gom Guard 2018. 1. 18.



2018 카카오 블라인드 코딩 1차 

  • http://tech.kakao.com/2017/09/27/kakao-blind-recruitment-round-1/

  • 카카오 에서는 블라인드 전형으로 공채 채용을 하고 있는데요, 이번 포스팅에선 2018년 1차 문제에 대해 살펴보겠습니다. 1차 문제는 총 7문제로 구성되어 있는데요, 5시간동안 4문제 이상 풀어내면 합격이라고 합니다. 언어는 어떤 언어든 상관 없으며 C, C++, JAVA, PYTHON 등 다양한 언어가 사용되었다고 합니다.



7. 추석 트래픽 - 문제 

  • 이번 추석에도 시스템 장애가 없는 명절을 보내고 싶은 어피치는 서버를 증설해야 할지 고민이다. 장애 대비용 서버 증설 여부를 결정하기 위해 작년 추석 기간인 9월 15일 로그 데이터를 분석한 후 초당 최대 처리량을 계산해보기로 했다. 초당 최대 처리량은 요청의 응답 완료 여부에 관계없이 임의 시간부터 1초(=1,000밀리초)간 처리하는 요청의 최대 개수를 의미한다.



입력 형식 

  • solution 함수에 전달되는 lines 배열은 N(1 ≦ N ≦ 2,000)개의 로그 문자열로 되어 있으며, 각 로그 문자열마다 요청에 대한 응답완료시간 S와 처리시간 T가 공백으로 구분되어 있다.

  • 응답완료시간 S는 작년 추석인 2016년 9월 15일만 포함하여 고정 길이 2016-09-15 hh:mm:ss.sss 형식으로 되어 있다.

  • 처리시간 T는 0.1s, 0.312s, 2s 와 같이 최대 소수점 셋째 자리까지 기록하며 뒤에는 초 단위를 의미하는 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초” 동안 처리된 요청을 의미한다. (처리시간은 시작시간과 끝시간을 포함)

  • 서버에는 타임아웃이 3초로 적용되어 있기 때문에 처리시간은 0.001 ≦ T ≦ 3.000이다.

  • lines 배열은 응답완료시간 S를 기준으로 오름차순 정렬되어 있다.




출력 형식 

  • solution 함수에서는 로그 데이터 lines 배열에 대해 초당 최대 처리량을 리턴한다.



입출력 형식 

  • 예제 1

    • 입력: [“2016-09-15 01:00:04.001 2.0s”,“2016-09-15 01:00:07.000 2s”]

    • 출력: 1

  • 예제 2

    • 입력: [“2016-09-15 01:00:04.002 2.0s”,“2016-09-15 01:00:07.000 2s”]

    • 출력: 2

    • 설명: 처리시간은 시작시간과 끝시간을 포함하므로 첫 번째 로그는 01:00:02.003 ~ 01:00:04.002에서 2초 동안 처리되었으며, 두 번째 로그는 01:00:05.001 ~ 01:00:07.000에서 2초 동안 처리된다. 따라서, 첫 번째 로그가 끝나는 시점과 두 번째 로그가 시작하는 시점의 구간인 01:00:04.002 ~ 01:00:05.001 1초 동안 최대 2개가 된다.

  • 예제 3

    • 입력: [ “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” ]

    • 출력: 7

    • 설명: 아래 타임라인 그림에서 빨간색으로 표시된 1초 각 구간의 처리량을 구해보면 (1)은 4개, (2)는 7개, (3)는 2개임을 알 수 있다. 따라서 초당 최대 처리량은 7이 되며, 동일한 최대 처리량을 갖는 1초 구간은 여러 개 존재할 수 있으므로 이 문제에서는 구간이 아닌 개수만 출력한다.



곰가드의 코드 


#time = ['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' ]
#time =  [ '2016-09-15 01:00:04.002 2.0s', '2016-09-15 01:00:07.000 2s' ]


def convert_time(lst, temp= [], res_start = [], res_end = []):
    for i in lst:
        temp.append(i.split())
        end_time = int(temp[-1][1][0:2])*3600 + int(temp[-1][1][3:5])*60 + int(temp[-1][1][6:8]) + float('0.'+temp[-1][1][9:])
        res_end.append(end_time)
        res_start.append(round(end_time - float(temp[-1][2][:-1]) + 0.001, 3))
    return res_start, res_end

time = [ '2016-09-15 01:00:04.001 2.0s', '2016-09-15 01:00:07.000 2s' ]

lst_start, lst_end = convert_time(time)

res = []
for k in lst_start + lst_end:
    cnt = 0
    for i, j in zip(lst_start, lst_end):
        cnt += 1 if i < k+1 and j >= k else 0
    res.append(cnt)
    
print(max(res))


  • convert_time 메소드는 입력 받은 시간을 초의 형태로 변환해주며 시작시간과 종료시간 리스트를 반환해 줍니다.

  • for loop 는 시작시간과 종료시간마다 몇개의 요청이 왔는지를 res 리스트에 추가시킵니다.

  • res 리스트 중 최대값이 문제에서 원하는 값임을 알 수 있습니다.








부족한 블로그에 방문해 주셔서 감사합니다.

잘못된 부분이나 질문이 있으시면 

댓글로 말씀해주세요.


금방 확인하고 피드백 드리겠습니다.


좋은 하루 되세요. ^^


댓글0