기타/알고리즘

(JS) 문자열과 숫자 변환 - split, map, toString, padStart [Programmers - 동영상 재생기]

가나닩 2024. 9. 28. 19:28
더보기

당신은 동영상 재생기를 만들고 있습니다. 당신의 동영상 재생기는 10초 전으로 이동, 10초 후로 이동, 오프닝 건너뛰기 3가지 기능을 지원합니다. 각 기능이 수행하는 작업은 다음과 같습니다.

  • 10초 전으로 이동: 사용자가 "prev" 명령을 입력할 경우 동영상의 재생 위치를 현재 위치에서 10초 전으로 이동합니다. 현재 위치가 10초 미만인 경우 영상의 처음 위치로 이동합니다. 영상의 처음 위치는 0분 0초입니다.
  • 10초 후로 이동: 사용자가 "next" 명령을 입력할 경우 동영상의 재생 위치를 현재 위치에서 10초 후로 이동합니다. 동영상의 남은 시간이 10초 미만일 경우 영상의 마지막 위치로 이동합니다. 영상의 마지막 위치는 동영상의 길이와 같습니다.
  • 오프닝 건너뛰기: 현재 재생 위치가 오프닝 구간(op_start ≤ 현재 재생 위치 ≤ op_end)인 경우 자동으로 오프닝이 끝나는 위치로 이동합니다.

동영상의 길이를 나타내는 문자열 video_len, 기능이 수행되기 직전의 재생위치를 나타내는 문자열 pos, 오프닝 시작 시각을 나타내는 문자열 op_start, 오프닝이 끝나는 시각을 나타내는 문자열 op_end, 사용자의 입력을 나타내는 1차원 문자열 배열 commands가 매개변수로 주어집니다. 이때 사용자의 입력이 모두 끝난 후 동영상의 위치를 "mm:ss" 형식으로 return 하도록 solution 함수를 완성해 주세요.

문제를 풀기위해 아래와 같은 요소들을 고려하였다.

  1. 시간을 분단위의 단순 숫자로 변환 : 분 단위의 숫자로 모두 변환(03:30 => 210분)하여 연산하기 편리하도록 함.
  2. 이동 매 시행 마다 오프닝 구간 검토 : 문제에 명확하게 보이지 않아서 헷갈렸는데 prev혹은 next명령을 한번 시행할때마다 오프닝 구간인지 확인해야한다.
더보기
function minuteTrans (timeString) {
    const [minute, second] = timeString.split(":").map(Number);
    const result = minute*60 + second;
    return result;
}

function solution(video_len, pos, op_start, op_end, commands) {
    const videoLen = minuteTrans(video_len);
    const posTrans = minuteTrans(pos);
    const opStart = minuteTrans(op_start);
    const opEnd = minuteTrans(op_end);
    
    var nowPos = posTrans;
    if(opStart <= posTrans && opEnd >= posTrans) nowPos = opEnd;
    
    for(let i=0;i<commands.length;i++){
        if(commands[i] === "prev") {
            if(nowPos < 10) nowPos = 0;
            else nowPos -= 10;
        } else if(commands[i] === "next") {
            if(videoLen-nowPos < 10) nowPos = videoLen;
            else nowPos += 10;
        }
        if(opStart <= nowPos && opEnd >= nowPos) nowPos = opEnd;
    }
    
    const nowHour = Math.floor(nowPos / 60);
    const nowMinute = nowPos % 60;

    var answer = `${nowHour.toString().padStart(2, '0')}:${nowMinute.toString().padStart(2, '0')}`;
    return answer;
}

삼항연산자와 forEach등을 활용해 코드를 간소화할수 있을 것 같다.

 

• split, map

시, 분 단위의 문자열로 주어지는 시간들을 분단위로 단순화 하여 숫자로 변환할때 사용했다.

  • split : 문자열을 특정 구분자로 나누어 배열로 변환한다. 예를들어 "03:30" 문자열을 split(":") 처리하면 구분자 ":"를 기반으로 나누어 ["03", "30"]으로 변환된다.
  • map : 주어진 함수를 배열에 적용하여 새로운 배열을 반환한다. 예를들어["03", "30"] 배열에 map(Number)를 사용하면 숫자로 변환되어 [03, 30]이 반환된다.

 

toString, padStart

연산이 끝나고 반환된 분단위의 숫자 결과값을 다시 시, 분단위의 시간 문자열로 변환할때 사용했다.

  • toString : 숫자를 문자열로 변환한다.
  • padStart : 문자열의 길이가 지정된 길이보다 짧으면 앞쪽에 특정 문자를 추가한다. 예를들어 "3"에 padStart(2, '0')을 사용하면 길이 2가 넘지 않으므로 "03"이 반환된다.

 

※ Math.floor

주어진 수보다 크지않은 가장 큰 정수를 반환한다. 쉽게말해 소수점을 버리고 작은쪽으로 내림한다.