티스토리 뷰

728x90
반응형

문제

동영상 재생기에 대한 명령어가 주어졌을 때, 알맞게 시간 이동하여 최종 재생 위치를 도출하는 문제이다.

명령어는 prev와 next 두 가지가 있으며, 현재 재생 위치가 오프닝 구간이면 자동으로 오프닝 건너뛰기를 실행한다.

prev 명령은 현재 재생 위치에서 10 이전으로 이동하는 명령어이며 0보다 작아지지 않는다.

next 명령은 현재 재생 위치에서 10 이후로 이동하는 명령어이며 최대 길이보다 커지지 않는다.

오프닝 건너뛰기는 오프닝 구간 (op_start ≤ 현재 위치 ≤ op_end)인 경우 op_end로 이동한다.

풀이

  • 문자열로 주어진 시간을 숫자로 변환하고, 명령어에 따라 시간을 더하고 뺌으로써 문제를 풀 수 있다.
    • mm:ss 가 주어지면 t = mm*60 + ss 로 변환한다.
    • prev 명령어가 주어지면 max(0, t - 10);
    • next 명령어가 주어지면 min(video_len, t + 10);
  • 오프닝 건너뛰기는 언제든 오프닝 구간에 진입했을 때 자동으로 시행됨에 주의한다.
  • 마지막 출력은 다시 시간 문자열 형태로 출력해야한다.

Python 코드

def solution(video_len, pos, op_start, op_end, commands):
    def skip(t):
        if op_start <= t <= op_end:
            return op_end
        return t
    
    def str2sec(s):
        mm,ss = map(int,s.split(":"))
        return mm*60+ss
    
    def sec2str(t):
        mm,ss = divmod(t,60)
        return f'{mm:02d}:{ss:02d}'
    
    video_len, pos, op_start, op_end = map(str2sec,[video_len, pos, op_start, op_end])
    pos = skip(pos)
    for command in commands:
        if command == "prev":
            pos = max(0, pos-10)
        else:
            pos = min(video_len, pos+10)
        pos = skip(pos)
            
    answer = sec2str(pos)
    return answer

 

Java 코드

class Solution {
    // 오프닝 건너뛰기
    public int skipOpening(int t, int op_start, int op_end) {
        if (t >= op_start && t <= op_end) {
            return op_end;
        }
        return t;
    }

    // 문자열을 초로 변환
    public int convertToSeconds(String s) {
        String[] parts = s.split(":");
        int mm = Integer.parseInt(parts[0]);
        int ss = Integer.parseInt(parts[1]);
        return mm * 60 + ss;
    }

    // 초를 문자열로 변환
    public String convertToString(int t) {
        int mm = t / 60;
        int ss = t % 60;
        return String.format("%02d:%02d", mm, ss);
    }

    public String solution(String video_len, String pos, String op_start, String op_end, String[] commands) {

        int videoLen = convertToSeconds(video_len);
        int position = convertToSeconds(pos);
        int opStart = convertToSeconds(op_start);
        int opEnd = convertToSeconds(op_end);

        // 오프닝 건너뛰기
        position = skipOpening(position, opStart, opEnd);

        // 명령어에 따른 동작
        for (String command: commands) {
            if (command.equals("prev")) {
                position = Math.max(position - 10, 0);
            } else {
                position = Math.min(position + 10, videoLen);
            }
            position = skipOpening(position, opStart, opEnd);
        }

        String answer = convertToString(position);
        return answer;
    }
}

 

문제출처

https://school.programmers.co.kr/learn/courses/30/lessons/340213

728x90
반응형
댓글