끄적끄적 코딩
article thumbnail
728x90

문제 설명

동영상 재생기는 10초 전으로 이동, 10초 후로 이동, 오프닝 건너뛰기 기능을 지원합니다.

  1. 10초 전으로 이동:
    • 사용자가 "prev" 명령을 입력하면 현재 위치에서 10초 전으로 이동합니다.
    • 현재 위치가 10초 미만이면 처음 위치(00:00)로 이동합니다.
  2. 10초 후로 이동:
    • 사용자가 "next" 명령을 입력하면 현재 위치에서 10초 후로 이동합니다.
    • 남은 시간이 10초 미만이면 마지막 위치(동영상 길이)로 이동합니다.
  3. 오프닝 건너뛰기:
    • 현재 위치가 오프닝 구간(op_start ≤ 현재 위치 < op_end)에 있을 경우, 오프닝 끝 위치(op_end)로 이동합니다.

모든 명령이 끝난 후 최종 재생 위치를 "mm:ss" 형식으로 반환합니다.


제한사항

  1. 동영상 시간:
    • 모든 시간은 "mm:ss" 형식.
    • 동영상의 길이와 위치는 항상 유효한 범위 내에 있음.
    • 오프닝 시작 시간(op_start)은 항상 오프닝 종료 시간(op_end)보다 앞에 있음.
  2. 명령어:
    • commands 배열의 길이는 최대 100.
    • "prev": 10초 전으로 이동.
    • "next": 10초 후로 이동.


해결 방법

알고리즘: 시뮬레이션

  1. 시간 변환:
    • 모든 "mm:ss" 형식을 초 단위 정수로 변환하여 계산 단순화.
    • 최종 결과는 다시 "mm:ss" 형식으로 변환.
  2. 명령어 처리:
    • "prev": 현재 위치에서 10초를 빼고 최소값 0으로 설정.
    • "next": 현재 위치에서 10초를 더하고 최대값(동영상 길이)으로 설정.
  3. 오프닝 구간 처리:
    • 현재 위치가 오프닝 구간에 있으면 위치를 오프닝 종료 위치(op_end)로 이동.
  4. 결과 반환:
    • 모든 명령 처리 후 최종 위치를 반환.


시간 복잡도

  • 명령 처리: 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}`;
}

검색 태그