코딩테스트

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

설탕시럽 2024. 11. 4. 23:25

문제

프로그래머스 코딩테스트 연습 : [PCCP 기출문제] 1번 / 동영상 재생기도움말

 

자료구조/알고리즘, 시간복잡도, 소요시간

  • 자료구조/알고리즘: -
  • 시간 복잡도: O(n)
  • 소요 시간: 45분

 

코드

function toFixedTime(minutes, seconds) {
    if(minutes.toString().length < 2) {
        minutes = '0' + minutes.toString();
    }
    if(seconds.toString().length < 2) {
        seconds = '0' + seconds.toString();
    }
    return minutes + ":" + seconds;
}

function isOpeningTime(minutes, seconds, op_start, op_end) {
    if( minutes > Number(op_start.split(":")[0]) && minutes < Number(op_end.split(":")[0]) ) {
        return true;
    } else if( minutes === Number(op_start.split(":")[0]) && seconds >= Number(op_start.split(":")[1]) ) {
        if( minutes < Number(op_end.split(":")[0]) ) {
            return true;
        } else if( minutes === Number(op_end.split(":")[0]) && seconds <= Number(op_end.split(":")[1]) ) {
            return true;
        } else {
            return false;
        }
    } else if( minutes === Number(op_end.split(":")[0]) && seconds <= Number(op_end.split(":")[1]) ) {
        if( minutes > Number(op_start.split(":")[0]) ) {
            return true;
        } else if( minutes === Number(op_start.split(":")[0]) && seconds >= Number(op_start.split(":")[1]) ) {
            return true;
        } else {
            return false;
        }
    } else {
        return false;
    }
}

function isVideoTimeOver(minutes, seconds, video_len) {
    if( minutes > Number(video_len.split(":")[0]) ) {
        return true
    } else if ( minutes === Number(video_len.split(":")[0]) && seconds >= Number(video_len.split(":")[1]) ) {
        
        return true;
    } else {
        return false;
    }
}

function solution(video_len, pos, op_start, op_end, commands) {
    let minutes = Number(pos.split(":")[0]);
    let seconds = Number(pos.split(":")[1]);
    
    commands.forEach((command) => {   
        if(isOpeningTime(minutes, seconds, op_start, op_end)) {
            minutes = Number(op_end.split(":")[0]);
            seconds = Number(op_end.split(":")[1]);
        } 
        
        
        if(command === "next") {
            seconds += 10;
            if(seconds > 59) {
                seconds -= 60;
                minutes += 1;
            }
        } else {
            seconds -= 10;
            if(seconds < 0) {
                if(minutes <= 0) {
                    minutes = 0;
                    seconds = 0;
                } else {
                    seconds += 60;
                    minutes -= 1;
                }
            }
        }
        
        if(isVideoTimeOver(minutes, seconds, video_len)) {
            minutes = Number(video_len.split(":")[0]);
            seconds = Number(video_len.split(":")[1]);
        }
    });
    
    if(isOpeningTime(minutes, seconds, op_start, op_end)) {
        minutes = Number(op_end.split(":")[0]);
        seconds = Number(op_end.split(":")[1]);
    } 
    
    return toFixedTime(minutes, seconds);   
}

 

회고

시간을 다룰때는 항상 에지케이스를 고려하자!!
시간이 분명 그 사이에 있는가? 에 대한 조건을 잘 세워보자!