문제 설명
- 동영상 재생기의 재생 위치를 10초씩 이동시키거나 오프닝 구간을 건너뛰는 기능을 구현
- 이동 명령(prev / next)과 오프닝 구간(op_start~op_end)이 주어졌을 때, 명령을 전부 수행한 후의 동영상 재생 위치를 반환주요 기능
- 10초 전으로 이동(prev):
재생 위치가 10초 미만이면 0분 0초로 이동 - 10초 후로 이동(next):
남은 시간이 10초 미만이면 동영상의 마지막으로 이동 - 오프닝 건너뛰기:
재생 위치가 오프닝 구간(op_start ≤ pos ≤ op_end)에 있으면 op_end(오프닝이 끝나는 시점)으로 이동포맷:모든 시간은 "mm:ss" 형태 (0분 0초 ~ 59분 59초)
동영상 길이(video_len), 초기 재생 위치(pos), 오프닝 구간 시작(op_start), 오프닝 구간 종료(op_end), 명령 배열(commands)이 주어짐
접근 방법
- 문제 유형 = 주어진 규칙들을 순서대로 처리하는 '구현(implementation)' 유형
- 처음에는 분/ 초 나누어서 10초를 증감하려다가 복잡해서 초단위로 모두 변환하기로 함
=> 자주 변환을 사용해서 함수화 시킴 - 명령이 여러개이므로 계속 현재 시간대(영상의 눈금)를 저장할 변수를 작성(result_sec)
- result_sec을 중간에 출력시켜서 결과를 점검해보았다.
- 오프닝 건너띄기 기능의 위치가 헷갈렸다.
모든 계산을 다 끝내고 해당하는지? 아니면, 중간중간 계속 오프닝 구간에 있으면 마지막으로 해줘야하는지 헷갈림
=>.test Case2를 보고 마지막에 계산하는 거라 생각하였다.
=> 그러나, test case3에서 오류가 발생하여 살펴보니 첫번째 시작 시 오프닝 구간에 들어가는 예외 케이스 고려하여 for문 안 첫 부분에 오프닝 스킵 코드를 삽입함
=> 그 과정에서 for 문안에 코드를 넣다 보니 예상치 못하게 문제가 해결됨
시간 복잡도
for문이 1개 이고 명령어 N개 일 때 for문이 1개만 있으므로 시간 복잡도는 O(N)이다.
코드
# 문자열을 초로 변환하는 함수
def str_to_seconds(min_str):
mm, ss = min_str.split(":")
mm =int(mm)
ss = int(ss)
seconds = mm*60 + ss
return seconds
def sec_to_str(sec):
mm = sec//60
ss = sec%60
if len(str(mm)) ==1:
mm = '0'+str(mm)
if len(str(ss)) ==1:
ss = '0'+str(ss)
return f"{mm}:{ss}"
def solution(video_len, pos, op_start, op_end, commands):
pos_sec = str_to_seconds(pos)
op_start_sec = str_to_seconds(op_start)
op_end_sec = str_to_seconds(op_end)
video_len_sec = str_to_seconds(video_len)
result_sec = pos_sec # command 사이 현재 눈금 위치를 알려주기 위한 변수
for s in commands:
if op_start_sec <= result_sec < op_end_sec:
result_sec = op_end_sec
if s == "prev":
if result_sec < 10:
result_sec = 0
else:
result_sec = result_sec - 10
elif s == "next":
if video_len_sec - result_sec < 10:
result_sec = video_len_sec
else:
result_sec = result_sec + 10
print(f"result_sec : {sec_to_str(result_sec)}")
if op_start_sec <= result_sec < op_end_sec:
result_sec = op_end_sec
answer = sec_to_str(result_sec)
return answer
'IT' 카테고리의 다른 글
캡스톤 디자인 진행과정 (0) | 2024.05.15 |
---|---|
CS기초 지식 공부를 시작하며 (2) | 2024.02.09 |