[PCCP 기출문제] 1번 / 동영상 재생기
Lv. 1
문제 설명
당신은 동영상 재생기를 만들고 있으며, 다음 3가지 기능을 지원해야 합니다.
prev
(10초 전으로 이동)- 현재 재생 위치에서 10초 이전으로 이동
- 단, 현재 위치가 10초 미만이면 **영상의 처음(0분 0초)**으로 설정
next
(10초 후로 이동)- 현재 재생 위치에서 10초 이후로 이동
- 단, 남은 시간이 10초 미만이면 영상의 끝으로 설정
- 오프닝 건너뛰기
- 현재 재생 위치가 오프닝 구간(
opStart
≤ 현재 위치 ≤opEnd
)에 있다면, - 자동으로 오프닝이 끝나는 위치(
opEnd
)로 이동 - 처음 시작 시간에도 마찬가지로, 자동으로 오프닝이 끝나는 위치로 이동
- 현재 재생 위치가 오프닝 구간(
- 입력
videoLen
: 동영상의 총 길이 ("mm:ss" 형식)pos
: 현재 재생 위치 ("mm:ss" 형식)opStart
: 오프닝 시작 시간 ("mm:ss" 형식)opEnd
: 오프닝 종료 시간 ("mm:ss" 형식)commands
: 수행할 명령어 목록 (prev
또는 **next
**로 구성된 배열)
- 출력
- 모든 명령을 수행한 후 최종 재생 위치를 "mm:ss" 형식으로 반환.
문제 풀이
Simulation
- 시간 변환 (
convertToSec
,convertToTime
)- "mm:ss" 형식의 시간을 초 단위로 변환하여 계산하고, 결과를 다시 "mm:ss" 형식으로 변환
- 오프닝 건너뛰기 (
skipOp
)- 오프닝 구간에 있을 때는 오프닝 마지막 시간으로, 아니면 현재 시간을 유지하는 로직 추가
- 명령어 처리 (
operate
)prev
는 10초 전으로 이동하고, 0초와 비교next
는 10초 후로 이동하고, 영상의 시간과 비교- 명령을 처리하고, 각 명령 후 오프닝 시간이라면 오프닝을 건너뜀
- 명령어 순차 실행
- 주어진 명령어 목록을 순차적으로 실행하여 최종 시간을 계산
export function playVideos(
videoLen: string,
pos: string,
opStart: string,
opEnd: string,
commands: string[],
): string {
const videoEndSec = convertToSec(videoLen);
const opStartSec = convertToSec(opStart);
const opEndSec = convertToSec(opEnd);
const skipOp = (sec: number): number => {
return opStartSec <= sec && sec <= opEndSec ? opEndSec : sec;
};
const operate = (sec: number, command: string): number => {
return skipOp(command === 'prev' ? Math.max(0, sec - 10) : Math.min(videoEndSec, sec + 10));
};
return convertToTime(commands.reduce(operate, skipOp(convertToSec(pos))));
}
function convertToSec(time: string): number {
const [minute, second] = time.split(':').map(Number);
return 60 * minute + second;
}
function convertToTime(sec: number): string {
const minute = String(Math.floor(sec / 60));
const second = String(sec % 60);
return `${minute.padStart(2, '0')}:${second.padStart(2, '0')}`;
}
JavaScript
function solution(videoLen, pos, opStart, opEnd, commands) {
const videoEndSec = convertToSec(videoLen);
const opStartSec = convertToSec(opStart);
const opEndSec = convertToSec(opEnd);
const skipOp = (sec) => {
return opStartSec <= sec && sec <= opEndSec ? opEndSec : sec;
};
const operate = (sec, command) => {
return skipOp(command === 'prev' ? Math.max(0, sec - 10) : Math.min(videoEndSec, sec + 10));
};
return convertToTime(commands.reduce(operate, skipOp(convertToSec(pos))));
}
function convertToSec(time) {
const [minute, second] = time.split(':').map(Number);
return 60 * minute + second;
}
function convertToTime(sec) {
const minute = String(Math.floor(sec / 60));
const second = String(sec % 60);
return `${minute.padStart(2, '0')}:${second.padStart(2, '0')}`;
}
복잡도
- 시간 복잡도:
- 공간 복잡도: