https://school.programmers.co.kr/learn/courses/30/lessons/340213
문제 설명
당신은 동영상 재생기를 만들고 있습니다. 당신의 동영상 재생기는 10초 전으로 이동, 10초 후로 이동, 오프닝 건너뛰기 3가지 기능을 지원합니다. 각 기능이 수행하는 작업은 다음과 같습니다.
- 10초 전으로 이동: 사용자가 "prev" 명령을 입력할 경우 동영상의 재생 위치를 현재 위치에서 10초 전으로 이동합니다. 현재 위치가 10초 미만인 경우 영상의 처음 위치로 이동합니다. 영상의 처음 위치는 0분 0초입니다.
- 10초 후로 이동: 사용자가 "next" 명령을 입력할 경우 동영상의 재생 위치를 현재 위치에서 10초 후로 이동합니다. 동영상의 남은 시간이 10초 미만일 경우 영상의 마지막 위치로 이동합니다. 영상의 마지막 위치는 동영상의 길이와 같습니다.
- 오프닝 건너뛰기: 현재 재생 위치가 오프닝 구간(op_start ≤ 현재 재생 위치 ≤ op_end)인 경우 자동으로 오프닝이 끝나는 위치로 이동합니다.
동영상의 길이를 나타내는 문자열 video_len, 기능이 수행되기 직전의 재생위치를 나타내는 문자열 pos, 오프닝 시작 시각을 나타내는 문자열 op_start, 오프닝이 끝나는 시각을 나타내는 문자열 op_end, 사용자의 입력을 나타내는 1차원 문자열 배열 commands가 매개변수로 주어집니다. 이때 사용자의 입력이 모두 끝난 후 동영상의 위치를 "mm:ss" 형식으로 return 하도록 solution 함수를 완성해 주세요.
제한사항
- video_len의 길이 = pos의 길이 = op_start의 길이 = op_end의 길이 = 5
- 1 ≤ commands의 길이 ≤ 100
입출력 예
video_len | pos | op_start | op_end | commands | result |
"34:33" | "13:00" | "00:55" | "02:55" | ["next", "prev"] | "13:00" |
"10:55" | "00:05" | "00:15" | "06:55" | ["prev", "next", "next"] | "06:55" |
"07:22" | "04:05" | "00:15" | "04:07" | ["next"] | "04:17" |
입출력 예 설명
입출력 예 #1
- 시작 위치 13분 0초에서 10초 후로 이동하면 13분 10초입니다.
- 13분 10초에서 10초 전으로 이동하면 13분 0초입니다.
- 따라서 "13:00"을 return 하면 됩니다.
입출력 예 #2
- 시작 위치 0분 5초에서 10초 전으로 이동합니다. 현재 위치가 10초 미만이기 때문에 0분 0초로 이동합니다.
- 0분 0초에서 10초 후로 이동하면 0분 10초입니다.
- 0분 10초에서 10초 후로 이동하면 0분 20초입니다. 0분 20초는 오프닝 구간이기 때문에 오프닝이 끝나는 위치인 6분 55초로 이동합니다. 따라서 "06:55"를 return 하면 됩니다.
입출력 예 #3
- 시작 위치 4분 5초는 오프닝 구간이기 때문에 오프닝이 끝나는 위치인 4분 7초로 이동합니다. 4분 7초에서 10초 후로 이동하면 4분 17초입니다. 따라서 "04:17"을 return 하면 됩니다.
def convert_to_seconds(time):
minutes, seconds = map(int, time.split(':'))
return minutes * 60 + seconds
def convert_to_minutes(time_sec):
minutes = time_sec // 60
seconds = time_sec % 60
return f'{minutes:02}:{seconds:02}'
def solution(video_len, pos, op_start, op_end, commands):
answer = ''
video_len_sec = convert_to_seconds(video_len)
pos_sec = convert_to_seconds(pos)
op_start_sec = convert_to_seconds(op_start)
op_end_sec = convert_to_seconds(op_end)
result_sec = pos_sec
for c in commands:
if op_start_sec <= result_sec <= op_end_sec:
result_sec = op_end_sec
if c == "next":
result_sec = min(result_sec + 10, video_len_sec)
elif c == "prev":
result_sec = max(result_sec - 10, 0)
if op_start_sec <= result_sec <= op_end_sec:
result_sec = op_end_sec
answer = convert_to_minutes(result_sec)
return answer
코드 설명
1. convert_to_seconds(time) 함수
목적: 시간을 분:초 형식으로 문자열을 초 단위로 변환합니다.
- 방법:
* time.split(':')을 사용해 분과 초를 나눕니다.
* map(int, ...)을 사용해 분과 초를 각각 정수로 변환합니다.
* 분 * 60 + 초를 계산하여 전체 초를 반환합니다.
-예시:
convert_to_seconds("3:45") # 3 * 60 + 45 = 225초
2. convert_to_minutes(time_sec) 함수
- 목적: 초 단위 시간을 분:초 형식의 문자열로 변환합니다.
- 방법:
* 시간 // 60으로 분을 계산하고, % 60으로 나머지 초를 계산합니다.
* 포매팅을 통해 두 자리 수로 표시합니다 (f'{minutes:02}:{seconds:02}').
- 예시:
convert_to_minutes(225) # '03:45'
3. solution(video_len, pos, op_start, op_end, commands) 함수
- 목적: 주어진 비디오 시간에서 명령어에 따라 비디오 시간을 조정하고 최종 시간을 반환합니다.
* 방법:
1. 비디오 길이, 재생 위치, 오퍼레이션 시작 및 종료 시간을 초 단위로 변환합니다.
2. result_sec 변수에 현재 비디오 시간(초)을 저장합니다.
3. commands 리스트를 반복하며 각 명령어에 따라 result_sec 값을 업데이트합니다:
* next: 현재 시간에서 10초를 더하고 비디오 길이를 넘어가지 않도록 클립합니다.
* prev: 현재 시간에서 10초를 빼고 음수가 되지 않도록 클립합니다.
4. 명령어 처리가 끝나면 result_sec를 convert_to_minutes 함수를 호출하여 분:초 형식으로 변환하여 최종 시간을 반환합니다.
동작 방식
- 초 단위로 변환: video_len, pos, op_start, op_end를 초 단위로 변환하여 비디오 시간을 초 단위로 통일합니다.
- 명령어 처리:
- if op_start_sec <= result_sec <= op_end_sec를 통해, 오퍼레이션 시작 및 종료 시간 내에 머물러 있어야 함을 보장합니다.
- next 명령어는 현재 시간에 10초를 추가합니다. 비디오 길이를 넘지 않도록 min()을 사용해 시간 클립합니다.
- prev 명령어는 현재 시간에서 10초를 빼고 음수로 클립합니다.
- 최종 시간 계산:
- 모든 명령어 처리가 완료된 후, 최종 시간을 convert_to_minutes 함수를 호출하여 분:초 형식으로 반환합니다.
후기
사실상 문자열 처리를 어떻게 할지가 가장 어려운 문제
time type을 잘 활용해서 푸는것도 방법일거 같다.
'코딩테스트' 카테고리의 다른 글
[이진탐색] 백준 나무자르기 자바 Java (0) | 2023.05.16 |
---|---|
[정렬] 프로그래머스 가장 큰 수 level2 자바 Java (0) | 2023.05.16 |
[완전탐색] 프로그래머스 최소직사각형 level1 Java (0) | 2023.05.09 |
[그리디] 프로그래머스 조이스틱 level2 Java (0) | 2023.05.09 |
[BFS]프로그래머스 여행경로 level3 Java (0) | 2023.05.09 |
댓글