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()