본문 바로가기
코딩테스트

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

by Enhydra lutris 2024. 12. 20.

https://school.programmers.co.kr/learn/courses/30/lessons/340213

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

문제 설명

당신은 동영상 재생기를 만들고 있습니다. 당신의 동영상 재생기는 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을 잘 활용해서 푸는것도 방법일거 같다.

 

댓글