본문 바로가기
알고리즘

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

by Gom Guard 2018. 1. 15.



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

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

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

4. 셔틀버스 - 문제 

  • 카카오에서는 무료 셔틀버스를 운행하기 때문에 판교역에서 편하게 사무실로 올 수 있다. 카카오의 직원은 서로를 ‘크루’라고 부르는데, 아침마다 많은 크루들이 이 셔틀을 이용하여 출근한다.

  • 이 문제에서는 편의를 위해 셔틀은 다음과 같은 규칙으로 운행한다고 가정하자.

    • 셔틀은 09:00부터 총 n회 t분 간격으로 역에 도착하며, 하나의 셔틀에는 최대 m명의 승객이 탈 수 있다.

    • 셔틀은 도착했을 때 도착한 순간에 대기열에 선 크루까지 포함해서 대기 순서대로 태우고 바로 출발한다. 예를 들어 09:00에 도착한 셔틀은 자리가 있다면 09:00에 줄을 선 크루도 탈 수 있다.

  • 일찍 나와서 셔틀을 기다리는 것이 귀찮았던 콘은, 일주일간의 집요한 관찰 끝에 어떤 크루가 몇 시에 셔틀 대기열에 도착하는지 알아냈다. 콘이 셔틀을 타고 사무실로 갈 수 있는 도착 시각 중 제일 늦은 시각을 구하여라.

  • 단, 콘은 게으르기 때문에 같은 시각에 도착한 크루 중 대기열에서 제일 뒤에 선다. 또한, 모든 크루는 잠을 자야 하므로 23:59에 집에 돌아간다. 따라서 어떤 크루도 다음날 셔틀을 타는 일은 없다.



입력 형식 

  • 셔틀 운행 횟수 n, 셔틀 운행 간격 t, 한 셔틀에 탈 수 있는 최대 크루 수 m, 크루가 대기열에 도착하는 시각을 모은 배열 timetable이 입력으로 주어진다.

    • 0 < n ≦ 10

    • 0 < t ≦ 60

    • 0 < m ≦ 45

  • timetable은 최소 길이 1이고 최대 길이 2000인 배열로, 하루 동안 크루가 대기열에 도착하는 시각이 HH:MM 형식으로 이루어져 있다.

  • 크루의 도착 시각 HH:MM은 00:01에서 23:59 사이이다.



출력 형식 

  • 콘이 무사히 셔틀을 타고 사무실로 갈 수 있는 제일 늦은 도착 시각을 출력한다. 도착 시각은 HH:MM 형식이며, 00:00에서 23:59 사이의 값이 될 수 있다.



입출력 예제 




곰가드의 코드 


def value_input(minvalue = 0,value = []):
    idx_str, max_value = ['n','t','m'], [10,60,45]
    for i in range(3):        
        while True:
            try:
                input_value = int(input('{} = '.format(idx_str[i])))
                if minvalue < input_value <= max_value[i]:
                    value.append(input_value)
                    break
                else:
                    print('wrong value')
            except:
                pass
    return value

def make_bustable(n,t,m, res=[]):
    for i in range(n):
        res.append(i*t+540)
    return res

def make_crewtable(res = []):
    while True:
        try:
            res = sorted(list(map(str2time,input('crew = ').split())), reverse = True)
            break
        except:
            pass
    return res
        
def str2time(string):
    return int(string[:2])*60+int(string[3:5])
def time2str(value):
    return str(int(value/60)).zfill(2)+":"+str(value%60).zfill(2)

n,t,m = value_input()
timetable_bus = make_bustable(n,t,m)
timetable_crew = make_crewtable()
res_table = [[] for i in range(n)]

for i in range(len(timetable_bus)):
    for j in range(len(timetable_crew)-1,-1,-1):
        if timetable_crew[j] <= timetable_bus[i] and len(res_table[i]) < m:
            res_table[i].append(timetable_crew.pop(j))
            
try:
    print(time2str(res_table[-1][m-1]-1))
except:
    print(time2str(timetable_bus[-1]))

  • value_input 메소드는 n, t, m 값을 범위에 맞게 조건 검사하며 받는 메소드 입니다. 

  • make_bustable 메소드는 n, t, m 을 기반으로 버스 시간표를 만들어 냅니다. 00:00 을 0 으로 분단위로 변환해서 res 리스트를 반환합니다.

  • make_crewtable 메소드는 크루들의 시간을 받아 분형태로 변환한 뒤 정렬해서 리스트를 반환합니다.

  • str2time, time2str 메소드는 09:00 형태의 string 값을 540 으로, 540을 09:00 의 형태로 변환해주는 메소드 입니다.

  • 크루들을 탈 수 있는 버스들에 배정한 뒤 기본적으로는 가장 마지막인원의 시간보다 1분 빠른 시간을 반환합니다. 만약 버스에 탈 수 있는 인원보다 기다리는 인원이 적은 경우에는 마지막 버스 시간을 반환합니다.








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

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

댓글로 말씀해주세요.


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


좋은 하루 되세요. ^^



댓글0