Problem Solving/Programmers

[Programmers]2018 KAKAO BLIND RECRUITMENT: [1차] 셔틀버스

이진2 2021. 2. 24. 01:19

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

카카오의 문자열 문제

쿠팡의 코딩테스트에서도, 이 문제에서도 시간을 문자열로 받아서 스케줄링하는 문제가 자주 나오던 것 같다

그래서 꼭 정복해야 할 것 같은.... 문제............... 시간 문자열 너무너무 싫지만 ㅠㅠ

 

시간에 대한 모든 부분을 클래스로 구현해서 관리해줬다. 

파이썬에는 datetime이라는 module도 있지만 그건 활용하는 법을 잘 몰라서 우선 클래스로 구현한 뒤 해설을 보고 datetime으로 변형해 볼 계획이다

우선 버스가 도착하는 가장 늦은 시간부터 시작해서 1분씩 감소시키면서, 콘이 탈 수 있는지 여부를 검사해주는 방식으로 구현했다.

import sys
import copy

class Time:
    h=0
    m=0

    def __init__(self,s):
        self.h=int(s[:2])
        self.m=int(s[3:])
    
    def plus(self, t):
        self.m+=t
        if self.m>=60:
            self.m-=60
            self.h+=1
        if self.h>=24:
            self.h-=24

    def minus(self):
        if self.h==0 and self.m==0: return False
        if self.m==0:
            self.h-=1
            self.m=59
        else: self.m-=1
        return True

    def same(self, other):
        if self.h==other.h and self.m==other.m: return True
        return False

    def __lt__(self, other):
        if self.h==other.h: return self.m<=other.m
        return self.h<=other.h

    def __repr__(self):
        return str(self.h)+':'+str(self.m)

    def st(self):
        s=''
        if self.h<10:s+='0'
        s+=str(self.h)
        s+=':'
        if self.m<10:s+='0'
        s+=str(self.m)
        return s


def solution(n, t, m, timetable):
    people=[]
    for k in timetable:
        people.append(Time(k))

    last=Time('09:00')
    for _ in range(n-1): last.plus(t)

    while True:
        p=copy.deepcopy(people)
        p.append(last)
        p.sort()

        bus=Time('09:00')
        b=True
        for _ in range(n):
            for _ in range(m):
                if len(p)==0 or b==False: break
                if p[0].__lt__(bus):
                    k = p.pop(0)
                    if k.same(last):
                        if len(p)>=1 and p[0].same(last):continue
                        b=False
                        break

            bus.plus(t)
            
        if b==False:
            break
        if not last.minus():break
    return last.st()