코딩테스트

[프로그래머스] 동영상 재생기 (JS)

여유로운 프론트엔드 개발자 2024. 9. 16. 13:31

문제

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

풀이

  (1) commands 배열 안 요소에 따라 현재 재생 시간 pos에서 10분을 더하거나 빼는 문제이다.

  (2) 함수 getAdjustedTime 생성 후 매개 변수로 받은 시간 변수 pos의 계산 결과를 return 한다.

function solution(video_len, pos, op_start, op_end, commands) {
    video_len = video_len.replace(":", "");
    pos = pos.replace(":", "");
    op_start = op_start.replace(":", "");
    op_end = op_end.replace(":", "");
    
    if (pos >= op_start && pos <= op_end) {
        pos = op_end;
    }
    
    commands.forEach((command) => {
        if (command === "next") {
            pos = getAdjustedTime(pos, "add"); 
            if (pos > video_len) {
                pos = video_len;
            } 
        } else if (command === "prev") {
            if (pos < "0010") {
                pos = "0000";
            } else {
                pos = getAdjustedTime(pos, "minus");   
            }
        }
        
        if (pos >= op_start && pos <= op_end) {
            pos = op_end;
        }
    })    
    
    return `${pos.slice(0, 2)}:${pos.slice(2, 4)}`;
}

const getAdjustedTime = (pos, type) => {
    const hours = Number(pos.slice(0, 2));
    const minutes = Number(pos.slice(2, 4));  

    let totalMinutes = hours * 60 + minutes;
    type === "add" ? totalMinutes += 10 : totalMinutes -= 10;

    const adjustedHours = Math.floor(totalMinutes / 60);
    const adjustedMinutes = totalMinutes % 60;
            
    return `${adjustedHours.toString().padStart(2, '0')}${adjustedMinutes.toString().padStart(2, '0')}`;
}

 

결론

구현 문제이다.

현재 재생 위치가 오프닝 구간(op_start ≤ 현재 재생 위치 ≤ op_end)인 경우 자동으로 오프닝이 끝나는 위치로 이동하거나, 10초 보다 작은 경우 00:00으로 이동하는 등 조건을 잘 따져야 한다. 또 시간 계산을 위해 시간 -> 분, 분 -> 시간으로 치환하는 로직을 알면 어렵지 않게 해결할 수 있다.