강의로 돌아가기
이채영

테케 3, 7, 9가 틀리는데 뭐가 원인일까요?

요구사항 추가한 것 같은데 ㅜㅜ 틀리는 테스트 케이스가 있습니다.

작성중인 코드―solution.py
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
"""

기능
- prev: 10초 전
    - 10초 미만일 경우 0분 0초
- next: 10초 후
    - 남은 시간이 10초 미만일 경우 마지막으로 
- 오프닝 건너뛰기: 오프닝 구간(op_start ≤ 현재 재생 위치 ≤ op_end)인 경우

결과
- 입력이 모두 끝난 후 동영상의 위치

"""
NEXT = "next"
PREV = "prev"

def solution(video_len, pos, op_start, op_end, commands):
    list_start = generate_num_list(op_start)
    list_end = generate_num_list(op_end)
    list_video_len = generate_num_list(video_len)
    list_video_len1 = list_video_len[:]
    minus_second(list_video_len1, 9)
    answer = generate_num_list(pos)

    for command in commands:
        if (check_is_between(list_start, answer, list_end)): # 오프닝인지 확인
            answer = list_end[:]

        # 커맨드 실행
        if command == NEXT:
            answer[1] += 10
            if (answer[1] >= 60):
                answer[0] += 1
                answer[1] -= 60
            if (check_is_after(list_video_len1, answer)): # video_len 보다 이후인지 확인
                answer = list_video_len[:]
        elif command == PREV:
            minus_second(answer, 10)
            if (not check_is_after([0, 9], answer)): # 10초 미만인지 확인
                answer = [0,0]

    if (check_is_between(list_start, answer, list_end)): # 오프닝인지 확인 (마지막 커맨드 이후에는 확인을 못 하기 때문에)
        answer = list_end[:]

    return '{0:02d}:{1:02d}'.format(answer[0], answer[1])

# time에서 second만큼 빼는 함수
def minus_second(time, second):
    time[1] -= second
    if (time[1] < 0):
        time[0] -= 1
        time[1] += 60

# now가 compare보다 이후의 시간인지 확인하는 함수
def check_is_after(compare, now):
    if (compare[0] <= now[0]):
        if (compare[0] == now[0]):
            return compare[1] <= now[1]
        else:
            return True
    return False


# now 시간이 start와 end 사이인지 확인하는 함수
def check_is_between(start, now, end):
    if start[0] <= now[0] <= end[0]:
        if start[0] == now[0]:
            return start[1] <= now[1]
        elif now[0] == end[0]:
            return now[1] <= end[1]
        else:
            return True

    return False

# "XX:YY" 문자열이 들어오면 [XX, YY]로 변경하는 함수
def generate_num_list(str):
    list_str = str.split(":")
    return [int(list_str[0]), int(list_str[1])]
  • 이채영

    check_is_between에서 사이인지 비교할 때 확인하는 함수에서 start == now == end인 케이스를 비교하지 않은 것이 원인이었습니다!

    이채영―2024.09.10 15:45
2 개의 답변
낙방여우

반례입니다.
입력값 〉 "30:00", "00:11", "05:00", "06:00", ["prev"]
기댓값 〉 "00:01"

  • 이채영

    반례 공유 감사합니다! 수정을 했는데도 Fail이 뜹니다... ㅜㅜㅜ

    이채영―2024.09.10 12:47
  • 이채영

    prev인 경우에 현재 위치가 10초 미만인 경우 영상의 처음 위치로 이동합니다. 영상의 처음 위치는 0분 0초입니다. 설명 때문에 기댓값이 "00:00"이 되어야 하는 것이 아닌가요?

    이채영―2024.09.10 12:48
낙방여우

11초에서 prev를 한 건데요. 반례입니다.
입력값 〉 "59:59", "59:45", "00:00", "01:00", ["next"]
기댓값 〉 "59:55"

  • 이채영

    반례 전달 감사합니다! '사용자가 "prev" 명령을 입력할 경우 동영상의 재생 위치를 현재 위치에서 10초 전으로 이동합니다. 현재 위치가 10초 미만인 경우 영상의 처음 위치로 이동합니다. 영상의 처음 위치는 0분 0초입니다.' 에 대해서 prev를 진행한다음 10초 미만인 경우 0으로 돌아와야 한다고 이해했었는제 아니였나보군요..!

    이채영―2024.09.10 15:36
답변 쓰기
이 입력폼은 마크다운 문법을 지원합니다.