프로그래머스 코딩 테스트 문제/lv1

프로래머스 Lv1 [PCCP 기출문제] 1번 동영상 재생기 문제

lys4321 2026. 2. 24. 12:43
  • 프로래머스 Lv1 [PCCP 기출문제] 1번 동영상 재생기 문제
    • 해당 문제의 난이도 상승 원인
      • 이동 전 / 이동 후 모두 오프닝 구간 체크가 필요
      • 특정 구간 자동 스킵 조건이 존재
    • 해당 문제를 해결한 방법
      • 시간 이동 전/후를 검사하여 특정 구간에 들어가면 특별 처리하도록 기능 작성
    • 문제의 핵심
      • '특정 구간'이라는 곳에 대한 경계처리가 중요
    • 이 문제의 목적
      • 경계값 처리에 대한 중요성을 일깨움
class VideoPlayer {
    public String solution(String video_len, String pos, String op_start, String op_end, String[] commands) {
        String answer = "";

        // 코딩 진행 상황
        // 입력값 전처리
        int tSec = (Integer.parseInt(video_len.split(":")[0]) * 60) + Integer.parseInt(video_len.split(":")[1]);
        int cSec = (Integer.parseInt(pos.split(":")[0]) * 60) + Integer.parseInt(pos.split(":")[1]);
        int osSec = (Integer.parseInt(op_start.split(":")[0]) * 60) + Integer.parseInt(op_start.split(":")[1]);
        int oeSec = (Integer.parseInt(op_end.split(":")[0]) * 60) + Integer.parseInt(op_end.split(":")[1]);

        int weight = 10;
        // commands 배열의 요소만큼 순환
        for(String c : commands){
            int setVal = (cSec >= tSec) ? tSec : cSec; // 비교값 계산
            if(Math.max(osSec, Math.min(setVal, oeSec)) == setVal){
                setVal = oeSec;
            }

            // c 에 따라 분기하여 처리
            if(c.equals("prev")){
                setVal -= weight;

                if(setVal <= 0){
                    cSec = 0;
                }
                else if((setVal >= osSec) && (setVal <= oeSec)){
                    cSec = oeSec; // 비교값이 오프닝 구간에 위치 시 처리 및 비교값 할당
                }
                else{
                    cSec = setVal;
                }
            }
            else if(c.equals("next")){

                setVal += weight; // 비교값 계산
                if(setVal >= tSec){
                    cSec = tSec; // 비교값이 전체 영상 길이 초과 시 처리 및 비교값 할당
                }
                else if((setVal >= osSec) && (setVal <= oeSec)){
                    cSec = oeSec; // 비교값이 오프닝 구간에 위치 시 처리 및 비교값 할당
                }
                else{
                    cSec = setVal; // 비교값 할당
                }
            }
        }

        int calSec = 60;

        // 계산된 최종 재생구간 값 처리
        answer =
                String.format("%02d", cSec / calSec) + ":" + String.format("%02d", cSec % calSec);

        return answer;
    }

    public static void main(String[] args) {
        String video_len = "34:33";
        String pos = "13:00";
        String op_start = "00:55";
        String op_end = "02:55";
        String[] commands = {"next", "prev"};

        VideoPlayer videoPlayer = new VideoPlayer();
        System.out.println("결과 : " + videoPlayer.solution(video_len, pos, op_start, op_end, commands));
    }
}