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

yewon Lee·2026년 1월 23일

link: 코딩테스트 연습 - [PCCP 기출문제] 1번 / 동영상 재생기

1. 문제 풀이

mm:ss를 전부 초로 바꾸어 시간을 이동한 뒤 다시 mm:ss 형태로 만들기

주의할 점

  • 언제든 오프닝 시간대에 있다면 오프닝은 건너뛰기

  • 배열 출력 - toString 까먹지 말자!

    	import java.util.Arrays;
    
    	String[] mn = video_len.split(":");
    	System.out.println(Arrays.toString(mn));

  • "mm:ss" 형식으로 출력하기

    1. format 사용

      answer = String.format("%02d:%02d", pos_m, pos_s);
    2. if문 사용

      String mm = (pos_m < 10) ? "0" + pos_m : "" + pos_m;
      String ss = (pos_s < 10) ? "0" + pos_s : "" + pos_s;
      
      answer = mm + ":" + ss;

2. 처음 코드

import java.util.*;

class Solution {
    public String solution(String video_len, String pos, String op_start, String op_end, String[] commands) {
        String answer = "";
        
        // video_len을 초로 바꾸기
        String[] video_mn = video_len.split(":");        
        int video_m = Integer.parseInt(video_mn[0]);
        int video_s = Integer.parseInt(video_mn[1]);        
        video_s += video_m * 60;
        
        // pos를 초로 바꾸기
        String[] pos_mn = pos.split(":");
        int pos_m = Integer.parseInt(pos_mn[0]);
        int pos_s = Integer.parseInt(pos_mn[1]);   
        pos_s += pos_m * 60;
        
        // op_stsrt 초로 바꾸기
        String[] ops_mn = op_start.split(":");
        int ops_m = Integer.parseInt(ops_mn[0]);
        int ops_s = Integer.parseInt(ops_mn[1]);
        ops_s += ops_m * 60;
        
        // op_end 초로 바꾸기
        String[] ope_mn = op_end.split(":");
        int ope_m = Integer.parseInt(ope_mn[0]);
        int ope_s = Integer.parseInt(ope_mn[1]);        
        ope_s += ope_m * 60;
        
        // commands 배열의 길이 저장
        int n = commands.length;

        for(int i = 0; i < n; i++){
        	// 현재 시간이 오프닝 사이에 있다면 오프닝 건너뛰기
            if(pos_s >= ops_s && pos_s <= ope_s)
                pos_s = ope_s;
            
            // next일 때 10초 후 비디오 길이 안에 있다면 10초 건너뛰기
            // 비디오 길이를 벗어난다면 비디오 끝으로 이동
            if(commands[i].equals("next")){
                if((pos_s + 10) < video_s)
                    pos_s += 10; 
                else 
                    pos_s = video_s;
			
            // prev일 때 10초 전 비디오 길이 안에 있다면 10초 되감기
            // 0초보다 전이라면 0초로 이동
            } else if(commands[i].equals("prev")){
                if((pos_s - 10) > 0)
                    pos_s -= 10;
                else
                    pos_s = 0;
            }
        }
        
        // 현재 시간이 오프닝 사이에 있다면 오프닝 건너뛰기
        if(pos_s >= ops_s && pos_s <= ope_s)
                pos_s = ope_s;
        
        // 분초로 바꾸기
        pos_m = pos_s / 60;
        pos_s = pos_s % 60;

		// "mm:ss" 형태로 바꾸기
        answer = String.format("%02d:%02d", pos_m, pos_s);
      
        return answer;
    }
}

오프닝 건너뛰기를 두 번 쓴게 아쉽고 더 좋은 코드가 있을 것 같다.

변경 코드

오프닝 한 번으로 줄이는 것은 불가능
시간을 초형태로 바꾸는 것은 함수로 빼낼 수 있음

import java.util.*;

class Solution {
	
    // 분초를 초로 바꾸는 함수
    private int toSec(String mmss){
        String[] ms = mmss.split(":");
        
        int m = Integer.parseInt(ms[0]);
        int s = Integer.parseInt(ms[1]);
        
        return s + m * 60;
    }
    
    public String solution(String video_len, String pos, String op_start, String op_end, String[] commands) {
        String answer = "";
        
        // 분초를 전부 초로 변경
        int video_s = toSec(video_len);
        int pos_s = toSec(pos);
        int ops_s = toSec(op_start);
        int ope_s = toSec(op_end);
        
        int n = commands.length;
        
        for(int i = 0; i < n; i++){
            if(pos_s >= ops_s && pos_s <= ope_s)
                pos_s = ope_s;
            
            if(commands[i].equals("next")){
                if((pos_s + 10) < video_s)
                    pos_s += 10; 
                else 
                    pos_s = video_s;

            } else if(commands[i].equals("prev")){
                if((pos_s - 10) > 0)
                    pos_s -= 10;
                else
                    pos_s = 0;
            }
        }
        
        if(pos_s >= ops_s && pos_s <= ope_s)
                pos_s = ope_s;
        
        int pos_m = pos_s / 60;
        pos_s = pos_s % 60;

        answer = String.format("%02d:%02d", pos_m, pos_s);
        
        return answer;
    }
}

지피티는 오프닝 건너뛰기를 루프 전에 한 번 루프 안 마지막에 한 번 하라고 했지만 큰차이 없으므로 그대로 사용
profile
시작

0개의 댓글