티스토리 뷰

반응형

 문제

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

 

 

 

 문제 상황

 

- 버스 이동 시간과 배차 간격이 주어지고 이를 이용해 최소한 막차를 타며 최대한 늦게 버스정류장에 나가야 하는 시간을 구하는 문제이다. 

 

 

 

 해결 전략

- 문제 상황을 그대로 시뮬레이션한다. 단, 예외 처리와 문제가 되는 상황을 정확히 파악하여야한다.

 

 

 

 코드

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
from collections import deque
def solution(n, t, m, timetable):
    for i in range(len(timetable)):
        hh, mm = timetable[i].split(":")
        timetable[i] = int(hh)*60 + int(mm)
    timetable.sort()
    timetable = deque(timetable)
    # 버스 시작시간
    start_bus = 540
    # 막차시간
    last_bus = start_bus + t*(n-1)
    # 체크할 m을 저장
    check = m
    # 마지막 버스이후에 온 사람이 대기열 제일 첫번째면 그냥 막차시간에 타면 된다.
    if timetable[0> last_bus:
        hh, mm = divmod(last_bus,60)
        return f"{hh:#02d}:{mm:#02d}"
    else:
        while True:
            if n != 1:
                # 만약 버스 시간보다 대기 시간이 더 빠르다면 대기열에서 제거해준다.
                if timetable[0<= start_bus and check > 0:
                    timetable.popleft()
                    # 한명이 탔다
                    check -= 1
                # 버스에 탈 사람이 없거나 버스에 좌석이 없다면 
                else :
                    # 다음 버스로 이동
                    start_bus += t
                    # 남은 버스의 수를 하나 줄인다.
                    n -= 1
                    # 다시 좌석수를 리셋
                    check = m
            # 막차가 되었을 때
            else:
                # 아직 대기하는 사람이 있으면
                if len(timetable) != 0 :
                    # 대기열 1번째 사람이 버스시간보다 늦게온다면
                    if timetable[0> start_bus:
                        # 버스 도착시간에 나온다.
                        hh, mm = divmod(start_bus,60)
                        return f"{hh:#02d}:{mm:#02d}"
                    # 대기열 1번째 사람이 버스시간보다 일찍 나온다면
                    else:
                        # 좌석이 한자리 남은게 아니면
                        if check != 1:
                            # 대기하는 사람을 태운다.
                            timetable.popleft()
                            check -= 1
                        # 좌석이 한자리 남았으면
                        else:
                            # 처음사람보다 1분은 먼저 와야한다.
                            hh, mm = divmod(timetable[0]-1,60)
                            return f"{hh:#02d}:{mm:#02d}"
                # 이제 대기하는 사람이 없으면
                else :
                    hh, mm = divmod(start_bus,60)
                    return f"{hh:#02d}:{mm:#02d}"           
    
cs

 

 

 해설

 

- 코드에 해설 첨언

 

 

 

 새로 학습한 것 & 실수 

 

- deque은 sort 할 수 없다.(내부적으로 이중 연결 리스트이기 때문에)

 

- f-string으로 자리수를 표현할 때 f"{변수:#02d}:{변수:#02d}"

 

- 조건에 따라 나누어 구현하면서 한가지 상황을 간과하였다. (39~42번 줄)

 

- 가장 처음에는 차 시간보다 가장 최근에 나와서 기다린 사람이 늦게 나온 상황을 계산했지만 조건을 나누어 상황을 설정하며 한가지 상황을 빼먹었다. 막차가 왔을 때 기다리는 사람이 있는데 그 사람이 그 다음차보다 늦게 나온 상황을 생각하지 못했다.

 

- 한번 코드를 짜놓고 일부 상황에서만 오류가 나면 패닉에 빠진다. 특히 예시는 다 통과할 때에는 내가 예시를 만들기 어려워 더 그런 경향이 있다. 그럴 때에는 차분하게 다시 코드를 보지말고 문제 상황을 이해하고 시뮬레이션한다. 그리고 코드의 흐름을 잡고 코드를 본다. 그 후에도 못찾으면 예시를 이용해 디버그한다.

 

 

 

반응형
댓글