IT

[코딩테스트] 프로그래머스 [PCCP 기출문제] 1번 / 동영상 재생기

buddlee 2025. 3. 4. 12:46

문제 설명

  • 동영상 재생기의 재생 위치를 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)이 주어짐

접근 방법

  1. 문제 유형 = 주어진 규칙들을 순서대로 처리하는 '구현(implementation)' 유형
  2. 처음에는 분/ 초 나누어서 10초를 증감하려다가 복잡해서 초단위로 모두 변환하기로 함
    => 자주 변환을 사용해서 함수화 시킴
  3. 명령이 여러개이므로 계속 현재 시간대(영상의 눈금)를 저장할 변수를 작성(result_sec)
  4. result_sec을 중간에 출력시켜서 결과를 점검해보았다.
  5. 오프닝 건너띄기 기능의 위치가 헷갈렸다.
    모든 계산을 다 끝내고 해당하는지? 아니면, 중간중간 계속 오프닝 구간에 있으면 마지막으로 해줘야하는지 헷갈림
    =>.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