일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- pcce 기출문제 10번 공원
- PCCE
- c++ 5567
- 수식 복원하기
- python 고대 문명 유적 탐사
- texture mapping
- DirectX12
- DirectX
- pcce 기출문제 9번 지폐 접기
- boj 1991
- boj 5567
- 프로그래밍공부
- 오블완
- root signature
- pcce 기출문제 10번 지폐 접기 풀이
- 코드트리 고대 문명 유적 탐사
- 백준 5567
- depth-stencil
- pccp 기출문제 풀이
- 잔디 기부 캠페인
- c++ 1991
- pcce 기출문제 10번 공원 풀이
- constant buffre
- 렌더링 파이프
- gemmasprint
- directx 그래픽스
- 고대 문명 유적 탐사
- 잔디 기부
- 티스토리챌린지
- pcce 기출문제 풀이
- Today
- Total
오구의코딩모험
[Python] [PCCP 기출문제] 1번 / 동영상 재생기 본문
https://school.programmers.co.kr/learn/courses/30/lessons/340213
문제 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을 채워줬다.
끝!
'프로그래밍 공부 > 프로그래머스' 카테고리의 다른 글
[Python] [PCCP 기출문제] 4번 / 수식 복원하기 (1) | 2024.09.13 |
---|---|
[Python] [PCCP 기출문제] 2번 / 퍼즐 게임 챌린지 (0) | 2024.09.12 |
[Python] 최소직사각형 (0) | 2023.01.06 |
[MySQL] 오프라인/온라인 판매 데이터 통합하기 (0) | 2023.01.04 |
[MySQL] 재구매가 일어난 상품과 회원 리스트 구하기 (0) | 2023.01.04 |