728x90
문제 설명
동영상 재생기는 10초 전으로 이동, 10초 후로 이동, 오프닝 건너뛰기 기능을 지원합니다.
- 10초 전으로 이동:
- 사용자가 "prev" 명령을 입력하면 현재 위치에서 10초 전으로 이동합니다.
- 현재 위치가 10초 미만이면 처음 위치(00:00)로 이동합니다.
- 10초 후로 이동:
- 사용자가 "next" 명령을 입력하면 현재 위치에서 10초 후로 이동합니다.
- 남은 시간이 10초 미만이면 마지막 위치(동영상 길이)로 이동합니다.
- 오프닝 건너뛰기:
- 현재 위치가 오프닝 구간(op_start ≤ 현재 위치 < op_end)에 있을 경우, 오프닝 끝 위치(op_end)로 이동합니다.
모든 명령이 끝난 후 최종 재생 위치를 "mm:ss" 형식으로 반환합니다.
제한사항
- 동영상 시간:
- 모든 시간은 "mm:ss" 형식.
- 동영상의 길이와 위치는 항상 유효한 범위 내에 있음.
- 오프닝 시작 시간(op_start)은 항상 오프닝 종료 시간(op_end)보다 앞에 있음.
- 명령어:
- commands 배열의 길이는 최대 100.
- "prev": 10초 전으로 이동.
- "next": 10초 후로 이동.
해결 방법
알고리즘: 시뮬레이션
- 시간 변환:
- 모든 "mm:ss" 형식을 초 단위 정수로 변환하여 계산 단순화.
- 최종 결과는 다시 "mm:ss" 형식으로 변환.
- 명령어 처리:
- "prev": 현재 위치에서 10초를 빼고 최소값 0으로 설정.
- "next": 현재 위치에서 10초를 더하고 최대값(동영상 길이)으로 설정.
- 오프닝 구간 처리:
- 현재 위치가 오프닝 구간에 있으면 위치를 오프닝 종료 위치(op_end)로 이동.
- 결과 반환:
- 모든 명령 처리 후 최종 위치를 반환.
시간 복잡도
- 명령 처리: O(n), 은 commands 배열의 길이(최대 100).
구현 코드
function solution(video_len, pos, op_start, op_end, commands) {
const toSeconds = (time) => time.split(":").reduce((a, c) => a * 60 + +c);
const totalSec = toSeconds(video_len);
const opStartSec = toSeconds(op_start);
const opEndSec = toSeconds(op_end);
let posSec = toSeconds(pos);
if(posSec >= opStartSec && posSec < opEndSec) {
posSec = opEndSec;
}
commands.forEach((command) => {
if(command === "next") {
posSec = Math.min(posSec + 10, totalSec);
} else if(command === "prev"){
posSec = Math.max(posSec - 10, 0);
}
if(posSec >= opStartSec && posSec < opEndSec) {
posSec = opEndSec;
}
})
const minute = String(Math.floor(posSec / 60)).padStart(2, "0");
const second = String(posSec % 60).padStart(2, "0");
return `${minute}:${second}`;
}
'알고리즘' 카테고리의 다른 글
[Javascript] 프로그래머스 - 공원 산책 (0) | 2025.01.03 |
---|---|
[Javascript] 프로그래머스 - 달리기 경주 (0) | 2025.01.02 |
[Javascript] 프로그래머스 - 붕대 감기 (0) | 2025.01.02 |
[Java] 프로그래머스 - 입국심사 (0) | 2023.08.28 |
[Java] 프로그래머스 - 택배 배달과 수거하기 (0) | 2023.08.28 |