오구의코딩모험

[Python] [PCCP 기출문제] 1번 / 동영상 재생기 본문

프로그래밍 공부/프로그래머스

[Python] [PCCP 기출문제] 1번 / 동영상 재생기

오구.cpp 2024. 9. 9. 16:30
반응형

 

 

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

 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

문제 3줄 요약

 

1. 3가지 기능이 있는 동영상 재생기를 만든다.

2. 기능은 10초 전으로 이동, 10초 후로 이동, 오프닝 건너뛰기 이다.

3. 사용자의 입력이 끝난 후 동영상의 위치를 구하라.

 


 

조건이 살짝 까다로워 보이지만,

차근차근 풀어보았다.

 

10초 전 이동 (='prev')10초 후 이동 (='next')

분(minute)을 기준으로 초(seconds)를 설정해주는 게 포인트!

 

이 글에선 되감기빨리감기로 표현하겠다.

 

## 분과 초를 기준으로 되감기, 빨리감기 기능
	for c in commands:
        if c == "prev":
            if (ss-10 < 0) and (mm>=1): 
                mm -= 1
                ss = 60+(ss-10)
            else:
                ss = max(0, ss-10)
        if c == "next":
            if (ss+10 >= 60) and (mm<end_mm): mm += 1
            
            if mm == end_mm:
                ss = min((ss+10) % 60, end_ss)
            else:
                ss = (ss+10) % 60

 

되감기 기능에서는

초가 음수가 될 경우에는 1분을 줄이고 초를 계산한다.

 

뺄셈을 할 때, 더 큰자리 수에서 한자리를 빌려오는 느낌.

물론 0분 이었다면, 빌려올 것이 없으니 예외다.

 

빨리감기 기능 또한 동일하다.

문제에서 각 동영상 별로 영상의 길이가 정해져있으니,

그 길이를 넘는다면 영상의 마지막 길이로 설정해주면 되겠다.

 

 

 

다음은 오프닝 건너뛰기 기능인데,

사실 이 문제에서 가장 까다로웠다고 느껴졌다.

 

    mm, ss = map(int, pos.split(":"))	## 현재 동영상 위치
    end_mm, end_ss = map(int, video_len.split(":"))	## 동영상 마지막 위치
    op_start_mm, op_start_ss = map(int, op_start.split(":"))	## 오프닝 시작 위치
    op_end_mm, op_end_ss = map(int, op_end.split(":"))	## 오프닝 마지막 위치
    
    if (op_start_mm<mm==op_end_mm and ss<op_end_ss) or \
        (op_start_mm<mm<op_end_mm) or \
        (op_start_mm==mm==op_end_mm and op_start_ss<=ss<op_end_ss) or \
        (op_start_mm==mm<op_end_mm and op_start_ss<=ss):
            mm, ss = op_end_mm, op_end_ss

 

 

현재 동영상의 위치가

오프닝의 시작과 마지막 사이에 위치해 있는 경우,

현재 동영상 위치를 오프닝 마지막 위치로 이동시켜줘야한다.

 

즉, 오프닝을 스킵해야한다.

단순하게 오프닝 시작 <= 현재 동영상 위치 < 오프닝 마지막으로 조건문을 설정해줬을 땐,

초 단위까지 비교가 되지않아서 위와 같이 작성했다.

 

※매우 중요※

사용자의 명령이 있기 전과 후로

동영상의 위치가 오프닝 범위 안이라면, 오프닝 건너뛰기가 자동으로 이루어져야한다.

 

종합해보면 다음과 같다.

def solution(video_len, pos, op_start, op_end, commands):
    answer = ''
    mm, ss = map(int, pos.split(":"))
    end_mm, end_ss = map(int, video_len.split(":"))
    op_start_mm, op_start_ss = map(int, op_start.split(":"))
    op_end_mm, op_end_ss = map(int, op_end.split(":"))
    
    if (op_start_mm<mm==op_end_mm and ss<op_end_ss) or \
        (op_start_mm<mm<op_end_mm) or \
        (op_start_mm==mm==op_end_mm and op_start_ss<=ss<op_end_ss) or \
        (op_start_mm==mm<op_end_mm and op_start_ss<=ss):
            mm, ss = op_end_mm, op_end_ss

    for c in commands:
        if c == "prev":
            if (ss-10 < 0) and (mm>=1): 
                mm -= 1
                ss = 60+(ss-10)
            else:
                ss = max(0, ss-10)
        if c == "next":
            if (ss+10 >= 60) and (mm<end_mm): mm += 1
            
            if mm == end_mm:
                ss = min((ss+10) % 60, end_ss)
            else:
                ss = (ss+10) % 60

        if (op_start_mm<mm==op_end_mm and ss<op_end_ss) or \
        (op_start_mm<mm<op_end_mm) or \
        (op_start_mm==mm==op_end_mm and op_start_ss<=ss<=op_end_ss) or \
        (op_start_mm==mm<op_end_mm and op_start_ss<=ss):
            mm, ss = op_end_mm, op_end_ss
    
    return str(mm).zfill(2)+":"+str(ss).zfill(2)

 

2자리 숫자가 맞춰줘야 하기 때문에

string의 내장함수인 zfill로 0을 채워줬다.

 

끝!

반응형
Comments