저고데

[프로그래머스][1차]셔틀버스 본문

프로그래머스

[프로그래머스][1차]셔틀버스

진철 2023. 2. 12. 22:04
728x90
반응형

문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/17678

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

코드를 작성하기 위한 순서는 다음과 같다.

1. 문자열의 형태("09:00")와 같은 시간을 숫자로 바꿔준 후, 오름차순 정렬을 해준다.

2. 하루 동안의 버스 출발 시간을 구해준다.

3. 버스를 기다리는 사람의 시간이 막차 버스 시간보다 늦다면 버스를 탈 수 없는 사람이기에 목록에서 제거한다.

4. 총 대기 인원의 수가 버스 한 대에 탈 수 있는 인원 수(m)보다 작으면 막차 버스 시간을 반환한다.

5. 4번에 해당하지 않는다면 막차 버스에 탑승한 인원만 확인하면 된다. 막차 버스에 탑승한 인원의 수가 m보다 작으면 막차 버스 시간을 반환한다.

6. 그렇지 않다면, 막차 버스에 탑승한 인원 중 가장 시간이 큰 값에서 1을 뺀 값을 반환한다.

def reconvert(time): #480을 "08:00"으로 반환하는 함수이다.
    hh = str(time//60)
    mm = str(time%60)
    if len(hh)==1:
        hh = '0'+hh
    if len(mm) == 1:
        mm = '0'+mm
    return hh+':'+mm

def convert(time): #"08:00"을 480으로 반환하는 함수이다.
    hh=int(time.split(':')[0])
    mm=int(time.split(':')[1])
    return hh * 60 + mm

def solution(n, t, m, timetable):
    bus = []
    wait = []
    
    for i in range(1, n+1): #2번
        bus.append(convert("09:00")+(i-1)*t)
        
    for i in timetable: #1번
        wait.append(convert(i))
    wait.sort()
    
    for i in range(len(wait)-1, -1, -1): #3번
        if wait[i]>bus[-1]:
            wait.pop(i)
            
    if len(wait) < m: #4번
        return reconvert(bus[-1])
    
    for i in range(len(bus)): 
        person = []
        for j in range(len(wait)):
            if len(person) == m:
                break
            if bus[i] >= wait[j]:
                person.append(wait[j])
                wait[j]=99999999999 #탑승한 인원은 큰 수를 대처하여 탑승했다고 표기한다.
            elif wait[j]==99999999999: #탑승한 인원을 따로 탐색할 필요 없기 때문에 넘어가준다.
                continue
            else: #대기 인원의 시간이 버스 시간보다 크면 탑승할 수 없는 경우이기에 반복문을 탈출한다.
                break
        if i == len(bus)-1: #막차 버스인 경우이다.
            if len(person) == m: #6번
                return reconvert(person[-1]-1)
            else: #5번
                return reconvert(bus[-1])

한 가지의 조건으로 답을 반환할 수 있는 경우를 분리하여 차근차근 코드를 작성하였다.

5, 6번을 생각하는데 시간을 많이 쓴 문제이다.

초기에는 set을 사용하여 중복되는 시간이 몇 개인지 구하고 그 값을 m과 비교하여 답을 반환하게 코드를 작성했었는데, 정확성이 너무 떨어졌었다.

그래서 다음과 같은 코드를 작성하게 되었다.

탑승한 인원은 pop을 사용하여 제거하려고 있으나 list range 에러가 발생하여 wait[j]=9999999999와 같이 문제의 조건에서 나올 수 없는 값을 대입하는 방법을 사용하였다.

역시 pop을 사용할 때는 반복문에서 변하는 list 범위를 잘 확인해야겠다.

728x90
반응형