[Java] 프로그래머스 Lv.1 동영상 재생기

Lee GaEun·2024년 12월 9일

[Java] 알고리즘

목록 보기
31/93

Lv.1 동영상 재생기 문제 링크

문제분석

  • "prev" : 10초 전으로 이동
    • 재생 위치를 현재 위치에서 10초 전으로 이동
    • 현재 위치가 10초 미만인 경우 영상의 처음 위치로 이동
    • 영상의 처음 위치는 0분 0초
  • "next" : 10초 후로 이동
    • 재생 위치를 현재 위치에서 10초 후로 이동
    • 남은 시간이 10초 미만일 경우 영상의 마지막 위치로 이동
    • 영상의 마지막 위치는 동영상의 길이와 같음
  • 오프닝 건너뛰기
    • 현재 재생 위치가 오프닝 구간(op_start ≤ 현재 재생 위치 ≤ op_end)인 경우 자동으로 오프닝이 끝나는 위치로 이동

제약 사항

  • video_len의 길이 = pos의 길이 = op_start의 길이 = op_end의 길이 = 5
  • video_len, pos, op_start, op_end는 "mm:ss" 형식으로 mm분 ss초를 나타냄
  • 0 ≤ mm ≤ 59
  • 0 ≤ ss ≤ 59
  • 분, 초가 한 자리일 경우 0을 붙여 두 자리로 나타냄
  • 비디오의 현재 위치 혹은 오프닝이 끝나는 시각은 항상 동영상의 범위 안임
  • 오프닝이 시작하는 시각은 항상 오프닝이 끝나는 시각보다 전임
  • 1 ≤ commands의 길이 ≤ 100
  • commands의 원소는 "prev" 혹은 "next"

입력 조건

출력 조건


#1

  • next(), skip() 함수 동작 시 범위 밖인 경우 videoInt, endInt를 반환
  • 이걸 posInt에 그대로 넣었더니 videoInt, endInt 주소를 posInt에 넣는 격이 돼서 videoInt, endInt 값이 훼손됨
  • 그래서 함수 안에서 copy본을 만들어서 넣어줌
class Solution {
    public String solution(String video_len, String pos, String op_start, String op_end, String[] commands) {
        String answer = "";

        int[] videoInt = clockSplit(video_len);
        int[] posInt = clockSplit(pos);
        int[] startInt = clockSplit(op_start);
        int[] endInt = clockSplit(op_end);

        for(int i=0; i<commands.length; i++) {
            posInt = skip(startInt, endInt, posInt);
            if(commands[i].equals("next")) posInt = next(videoInt, posInt);
            else posInt = prev(posInt);
        }
        posInt = skip(startInt, endInt, posInt);

        for(int i=0; i<2; i++) {
            if(posInt[i] < 10) {
                answer+="0";
                answer+=posInt[i];
            }
            else answer+=posInt[i];
            answer+= i==0 ? ":" : "";
        }

        return answer;
    }

    private static int[] clockSplit(String arr) {
        String[] SArr = arr.split(":");
        int[] intArr = new int[2];
        for(int i=0; i<2; i++) {
            intArr[i] = Integer.parseInt(SArr[i]);
        }
        return intArr;
    }

    private static int[] next(int[] videoInt, int[] posInt) {
        int[] videoIntCopy = {videoInt[0], videoInt[1]};
        posInt[1] += 10;
        if(posInt[1] >= 60) {
            posInt[0] += 1;
            posInt[1] -= 60;
        }
        if((videoInt[0] < posInt[0]) || (videoInt[0] == posInt[0] && videoInt[1] <= posInt[1])) return videoIntCopy;
        return posInt;
    }

    private static int[] prev(int[] posInt) {
        posInt[1] -= 10;
        if(posInt[1] < 0) {
            posInt[0] -= 1;
            posInt[1] += 60;
        }
        if((0 > posInt[0]) || (0 == posInt[0] && 0 >= posInt[1])) {
            posInt[0] = 0;
            posInt[1] = 0;
        }
        return posInt;
    }

    private static int[] skip(int[] startInt, int[] endInt, int[] posInt) {
        int[] endIntCopy = {endInt[0], endInt[1]};
        if(((startInt[0] < posInt[0]) || (startInt[0] == posInt[0] && startInt[1] <= posInt[1])) && ((posInt[0] < endInt[0]) || (posInt[0] == endInt[0] && posInt[1] <= endInt[1]))) return endIntCopy;
        return posInt;
    }
}

  • 성공!
profile
I will give it my all (๑•̀o•́๑)ง

0개의 댓글