[2018 KAKAO BLIND RECRUITMENT] 셔틀버스

2021. 5. 8. 00:43·알고리즘 문제풀이

programmers.co.kr/learn/courses/30/lessons/17678

 

코딩테스트 연습 - [1차] 셔틀버스

10 60 45 ["23:59","23:59", "23:59", "23:59", "23:59", "23:59", "23:59", "23:59", "23:59", "23:59", "23:59", "23:59", "23:59", "23:59", "23:59", "23:59"] "18:00"

programmers.co.kr

def append_waiting(start,end,datetimes):
    global waiting
    while datetimes:
        if start <= datetimes[0] <= end:
            waiting.append(datetimes.popleft())
        else:
            break

waiting = deque([])

def solution(n, t, m, timetable):
    
    total = n*m
    times = []

    for time in timetable:
        H,M = time.split(":")
        minutes = int(H)*60 + int(M)
        times.append(minutes)

    times.sort()
    datetimes = deque(times)

    zero = 0
    end = 9*60

    append_waiting(zero,end,datetimes)

    print("waiting 시작 초기화 : ",waiting)

    call_arive = False
    call_time = 0

    for i in range(n):
        waiting_num = len(waiting)

        if waiting_num >= total:
            # 콜도 타야함.
            print("waiting : ",waiting)
            call_time = waiting[total-1] - 1
            call_arive = True
            break

        else:
            # 콜 안탐
            
            # waiting에서 m명만큼 비움
            for _ in range(m):
                if waiting:
                    waiting.popleft()
                else:
                    break
            
            # 가능인원 줄임
            total -= m

            #waiting에 다음 시간 추가

            start, end = end,end+t
            append_waiting(start,end,datetimes)

    
    if call_arive:
        
        h = str(call_time//60)
        m = str(call_time%60)

        if len(h) < 2:
            h = "0"+h
        if len(m) < 2:
            m = "0"+m
        return h+":"+m
    else:
        h = str(start//60)
        m = str(start%60)

        if len(h) < 2:
            h = "0"+h
        if len(m) < 2:
            m = "0"+m
        return h+":"+m

풀이

시간을 분으로 바꾸는걸 생각을 못해서 datetime 모듈사용하려다 모듈에 대한 이해가 적어서 더 헷갈렸다.

datetime모듈사용 자제하고 푸는 법을 먼저 생각해야 할 것 같다.

 

풀이법은 이렇다.

 

버스는 9:00 부터 +t 한시간 안에 가장 먼저 도착한 m명을 태우는 행위를 n번 반목한다.

 

최대 태울 수 있는 인원 total을 구한다. total = n*m 이다.

 

waiting 그룹을 초기화한다.

먼저 00:00 부터 9:00 까지 서있는 사람들을 넣는다.

 

total - len(waiting) 을 한게 0 이하라면 콘또한 이 waiting 그룹에 포함되어야 한다.

 

1이상이라면 버스를 1대씩 보내고

waiting그룹에서 m명 보내고, 다음 시간대 크루를 waiting에 추가한다.

total 에서는 m만큼 빼준다.

 

계속 0이하가 되는지 확인한다.

 

0이하가 되었다면 거기서 total위안에 들어야한다. total번째 녀석보다 1분 빠른게 답이다.

 

마지막버스까지 공간이 남는다면 마지막 버스 도착시간이 답이다.

 

시간복잡도

timetable에 있는 사람들을 한번씩 조회하면 된다. 시간복잡도는 O(m) 이다.

'알고리즘 문제풀이' 카테고리의 다른 글

[백준 1188] 음식 평론가  (0) 2021.05.11
[2021 KAKAO BLIND RECRUITMENT] 합승 택시 요금  (0) 2021.05.08
[백준 17218] ⚾  (0) 2021.05.07
[백준 1013] Contact  (0) 2021.05.07
[백준 2257] 화학식량  (0) 2021.05.07
'알고리즘 문제풀이' 카테고리의 다른 글
  • [백준 1188] 음식 평론가
  • [2021 KAKAO BLIND RECRUITMENT] 합승 택시 요금
  • [백준 17218] ⚾
  • [백준 1013] Contact
WildDevmon
WildDevmon
『앗! 야생의 개발몬(이)가 나타났다!』
  • WildDevmon
    야생의 개발몬
    WildDevmon
  • 전체
    오늘
    어제
    • 분류 전체보기 (35)
      • Server (5)
      • 알고리즘 문제풀이 (27)
      • 회고 (3)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    백준 30
    graceful shutdown
    커널 스레드 상태
    백준 경쟁적 전염
    선발 명단
    1114백준
    백준 어린 왕자
    preStop
    백준 1114
    백준 17281
    2020 카카오 인턴
    ai개발자
    카카오 필요스펙
    백준14465
    direct buffer
    자바 물리 메모리
    백준1238
    백준 18405
    terminationGracePeriodSeconds
    우아한 종료
    네카라쿠배 취업
    백준1188
    백준 1114 파이썬
    소수&팰린드롬
    백준 고층 건물
    백준 1034
    자바 최소공배수
    자바 최대공약수
    백준2262
    백준 램프
    컴공 취준
    다이렉트 버퍼
    백준 파티
    자바 스레드 상태
    백준 10610
    백준15954
    백준 인형들
    합승 택시 요금
    코틀린 코루틴
    소가 길을 건너간 이유 5
    자바 프로세스 종료
    네이티브 메모리
    백준1747
    백준 1027
    경력 서류
    통나무 자르기
    백준 5347
    백준6980
    백준 1004
    파이썬
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
WildDevmon
[2018 KAKAO BLIND RECRUITMENT] 셔틀버스
상단으로

티스토리툴바