코딩 테스트/프로그래머스 코딩 테스트 연습

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

58청춘 2024. 11. 26. 18:23
728x90

문제

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

풀이

해당 문제는 구현 문제였다. 이 문제에서 주의할 점은 두 가지가 있다.

 

첫 번째는 시간의 변환이다. 구현하는 기능 중 시간의 비교를 하는 과정이 포함되어 있다.

이때 보다 효율적으로 시간을 관리하기 위해 (60 * 분) + 초 형식의 정수로 관리한다.

 

두 번째는 각 이벤트 처리이다.

이 문제에서는 오프닝 건너뛰기, prev시 10초 미만이 남았을 때 00:00으로, next시 10초 미만이 남았을 때 영상의 끝으로 이동하는 이벤트가 있다.

 

이러한 이벤트는 각각 처리해야하는 타이밍이 존재한다.

오프닝 건너뛰기는 각 명령어 입력 전에 측정하고 동작해야하며, 나머지 두 이벤트는 prev 혹은 next 이후에 검증해도 된다.

 

또한 next 혹은 prev 이벤트 동작 이전 이후에도 항상 오프닝 건너뛰기 시간에 있는지 확인해야 한다.

이유는 동작 이전 이후에 해당 범위에 위치한다면 무조건 오프닝을 건너뛰어야 하기 때문이다.

 

코드

const makeTime = (time) => {
  const [min, sec] = time.split(':').map(Number);
  return (min * 60) + sec;
}

const solution = (video_len, pos, op_start, op_end, commands) => {
  let answer = ['', ''];
  let cur = makeTime(pos);
  const opS = makeTime(op_start);
  const opE = makeTime(op_end);
  const vL = makeTime(video_len);
  
  if (cur >= opS && cur <= opE) {
    cur = opE;
  }

  for (let i = 0; i < commands.length; i++) {
    if (cur >= opS && cur <= opE) {
      cur = opE;
    }
    cur += (commands[i] === 'next' ? 1 : -1) * 10;
    if (cur < 0) {
      cur = 0;
    }
    else if (cur > vL) {
      cur = vL;
    }
  }

  if (cur >= opS && cur <= opE) {
    cur = opE;
  }

  answer[0] = Math.floor((cur) / 60) >= 10 ? `${Math.floor((cur) / 60)}` : `0${Math.floor((cur) / 60)}`;
  answer[1] = Math.floor((cur) % 60) >= 10 ? `${Math.floor((cur) % 60)}` : `0${Math.floor((cur) % 60)}`;

  return `${answer[0]}:${answer[1]}`;
};
728x90