본문 바로가기

프로그래머스(Java)/Level 1

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

728x90

코드 힌트:

  1. 동영상 시간 처리:
    • 동영상의 전체 길이와 현재 재생 위치, 오프닝 구간 시작/종료 시간을 모두 분 단위로 변환하여 처리합니다.
  2. 명령어 처리:
    • next 명령어는 10초 앞으로 이동, 그 외 명령어는 10초 뒤로 이동하게 구현합니다.
  3. 오프닝 구간 스킵:
    • 오프닝 구간에 도달하면 해당 구간을 넘어서 이동합니다.
  4. 시간 설정 및 포맷 변환:
    • 현재 시간이 동영상의 길이를 벗어나지 않도록 제한하고, 시/분 형식으로 변환해 출력합니다.

 


정답은 더보기 클릭

더보기
class Solution {
    public String solution(String video_len, String pos, String op_start, String op_end, String[] commands) {
        // Video 객체 생성 (동영상 전체 길이, 현재 위치, 광고 시작 시간, 광고 종료 시간)
        Video video = new Video(video_len, pos, op_start, op_end);
        
        // 주어진 명령어에 따라 동영상 위치 이동
        for (String command : commands) {
            video.move(command); // 각 명령어를 Video 객체에 전달하여 처리
        }
        
        return video.toString(); // 최종적으로 변환된 시간 반환
    }
}

class Video {
    int vdTime; // 동영상 전체 길이 (초 단위)
    int curTime; // 현재 재생 위치 (초 단위)
    int opStart; // 오프닝 시작 시간 (초 단위)
    int opEnd; // 오프닝 종료 시간 (초 단위)
    
    public Video(String video_len, String pos, String op_start, String op_end) {
        // 동영상 길이, 현재 위치, 오프닝 시작/종료 시간을 분 단위로 초로 변환하여 저장
        this.vdTime = Integer.parseInt(video_len.split(":")[0]) * 60 + 
                        Integer.parseInt(video_len.split(":")[1]);
        
        this.curTime = Integer.parseInt(pos.split(":")[0]) * 60 + 
                        Integer.parseInt(pos.split(":")[1]);
        
        this.opStart = Integer.parseInt(op_start.split(":")[0]) * 60 + 
                        Integer.parseInt(op_start.split(":")[1]);
        
        this.opEnd = Integer.parseInt(op_end.split(":")[0]) * 60 + 
                        Integer.parseInt(op_end.split(":")[1]);
        
        opSkip(); // 처음부터 광고 구간에 있는지 확인하여 스킵
    }
    
    // 오프닝 구간에 있는지 확인하고, 오프닝이 시작되었으면 광고 종료 지점으로 이동
    void opSkip() {
        if (opStart <= curTime && curTime < opEnd)
            curTime = opEnd;
    }
    
    // 명령어에 따라 동영상 위치 이동
    void move(String command) {
        if (command.equals("next"))
            curTime += 10; // "next"는 10초 앞으로 이동
        else
            curTime -= 10; // 그 외 명령어는 10초 뒤로 이동
        
        timeSet(); // 이동 후 현재 시간이 적절한 범위 내에 있는지 확인
    }
    
    // 동영상 시간이 유효한 범위 내에 있는지 확인
    void timeSet() {
        if (curTime < 0)
            curTime = 0; // 최소 0초로 제한
        else if (curTime > vdTime)
            curTime = vdTime; // 최대 동영상 길이로 제한
        
        opSkip(); // 이동 후에도 광고 구간에 있는지 확인하여 스킵
    }
    
    // 현재 시간을 "분:초" 형식으로 변환
    @Override
    public String toString() {
        String mm = "" + curTime / 60;
        String ss = "" + curTime % 60;
        
        // 1자리 숫자인 경우 앞에 0을 붙여서 "분:초" 형식으로 만듦
        if (mm.length() == 1)
            mm = "0" + mm;
        if (ss.length() == 1)
            ss = "0" + ss;
        
        return mm + ":" + ss; // 최종 결과 반환
    }
}
728x90