코딩관계론

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

개발/알고리즘

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

개발자_티모 2025. 4. 28. 08:03
반응형

문제 이해하기

  • next 연산이 있을 시 + 10초 
  • prev 연산이 있을 시 - 10초 
  • 다만 최소 0초에서 최대 video_len 까지만 이동이 가능함
  • 오프닝 구간에 있을 경우에는 오프닝의 마지막 시간으로 이동해야 한다.

문제 해결 방법 설명하기

1. 초로 통일 

 

코드

function changeSec(time){
    let [min, sec] = time.split(':').map(Number)
    return min * 60 + sec
}

function secToMin(time){
    min = Math.floor(time / 60)
    sec = time % 60

    if(min < 10){
        min = `0${min}`
    }

    if(sec < 10){
        sec = `0${sec}`
    }

    return `${min}:${sec}`
}


function solution(video_len, pos, op_start, op_end, commands) {
    var answer = '';

    video_len = changeSec(video_len)
    pos = changeSec(pos)
    op_start = changeSec(op_start)
    op_end = changeSec(op_end)

    for (let command of commands){
        if (op_start <= pos && pos <= op_end){
            pos = op_end
        }
        
        if (command === 'prev'){
            pos = Math.max(pos - 10, 0)
        }

        if(command === 'next'){
            pos  = Math.min(pos + 10, video_len)
        }
    }
    
    
    if (op_start <= pos && pos <= op_end){
        pos = op_end
    }

    return secToMin(pos);
}

코드 리뷰

function toSeconds(time) {
  const [minute, second] = time.split(":");
  return minute * 60 + Number(second);
}

function solution(video_len, pos, op_start, op_end, commands) {
  let position = toSeconds(pos);
  const videoLen = toSeconds(video_len);
  const opStart = toSeconds(op_start);
  const opEnd = toSeconds(op_end);

  if (opStart <= position && position <= opEnd) position = opEnd;

  commands.forEach((command) => {
    position += command === "next" ? 10 : -10;
    position = Math.max(0, Math.min(position, videoLen));
    if (opStart <= position && position <= opEnd) position = opEnd;
  });

  const minute = Math.floor(position / 60).toString().padStart(2, "0");
  const second = (position % 60).toString().padStart(2, "0");
  return minute + ":" + second;
}

배운점 정리하기

나의 코드를 확인해보면 오프닝 구간을 건너띄기 위해서 매번 계산하고 있는데, 잘 생각해보면 그럴 필요가 없다

for 진입 전에 오프닝 구간인지를 판별한 후, 반복문이 끝나는 구간에서 오프닝 구간 판별 연산을 수행하게 된다면, 항상 오프닝 인지 판별될 수 있기 때문에 불필요한 코드를 줄일 수 있다.

 

또한 padStart 문법 역시 잘 배웠다.

반응형