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

syeony·2025년 6월 10일
0

Java

목록 보기
8/19

문제 바로가기

접근방식

처음에 시간이랑 분을 따로 Int형으로 나눠서 생각했다. 그래서 나온 복잡한 처음 정답코드...근데 너무 복잡해서 gpt한테 물어보니 분으로 바꿔서 접근하면 쉽게 풀 수 있다고 했다. 그래서 두가지 방식으로 구현해보았다.

처음 정답코드(시,분 따로계산)

class 동영상재생기 {
    public String solution(String video_len, String pos, String op_start, String op_end, String[] commands) {
        String[] video=video_len.split(":");
        int v_hour=Integer.parseInt(video[0]);
        int v_minute=Integer.parseInt(video[1]);
        String[] time=pos.split(":");
        int hour=Integer.parseInt(time[0]);
        int minute=Integer.parseInt(time[1]);
        String[] start=op_start.split(":");
        int s_hour=Integer.parseInt(start[0]);
        int s_minute=Integer.parseInt(start[1]);
        String[] end=op_end.split(":");
        int e_hour=Integer.parseInt(end[0]);
        int e_minute=Integer.parseInt(end[1]);

        if(isInRange(hour, minute, s_hour, s_minute, e_hour, e_minute)){
            hour=e_hour;
            minute=e_minute;
        }

        for(int i=0;i<commands.length;i++){
            if(commands[i].equals("next")){
                if(minute>=50){
                    if(hour<v_hour) {
                        hour++;
                        if(hour==v_hour){
                            if(minute+10-60>=v_minute){
                                minute=v_minute;
                            }else minute=minute+10-60;
                        }else minute=minute+10-60;
                    }
                    else {
                        if(minute+10<v_minute){
                            minute+=10;
                        }else{
                            minute=v_minute;
                        }
                    }
                }else{
                    if(hour==v_hour){
                        if(minute+10<v_minute){
                            minute+=10;
                        }else{
                            minute=v_minute;
                        }
                    }else{
                        minute+=10;
                    }
                }
            }else{ //prev
                if(minute<10){
                    if(hour>0) {
                        hour--;
                        minute = minute - 10 + 60;
                    }
                    else { //hour==0
                        minute=0;
                    }
                }else{
                    minute-=10;
                }
            }

            if(isInRange(hour, minute, s_hour, s_minute, e_hour, e_minute)){
                hour=e_hour;
                minute=e_minute;
            }
            //System.out.println(String.valueOf(hour)+":"+String.valueOf(minute));
        }

        String h=String.valueOf(hour);
        String m=String.valueOf(minute);
        if(h.length()==1){
            h="0"+h;
        }
        if(m.length()==1){
            m="0"+m;
        }
        return h+":"+m;
    }

    // 구간 비교 함수
    private boolean isInRange(int hour, int minute, int s_hour, int s_minute, int e_hour, int e_minute){
        boolean afterStart = (hour > s_hour) || (hour == s_hour && minute >= s_minute);
        boolean beforeEnd = (hour < e_hour) || (hour == e_hour && minute <= e_minute);
        return afterStart && beforeEnd;
    }
}

두번째 정답코드(분으로 변환하여 계산)

class 동영상재생기2 {
    public String solution(String video_len, String pos, String op_start, String op_end, String[] commands) {
        String[] video=video_len.split(":");
        int v_hour=Integer.parseInt(video[0]);
        int v_minute=Integer.parseInt(video[1]);
        String[] time=pos.split(":");
        int hour=Integer.parseInt(time[0]);
        int minute=Integer.parseInt(time[1]);
        String[] start=op_start.split(":");
        int s_hour=Integer.parseInt(start[0]);
        int s_minute=Integer.parseInt(start[1]);
        String[] end=op_end.split(":");
        int e_hour=Integer.parseInt(end[0]);
        int e_minute=Integer.parseInt(end[1]);

        int v_len=toMinute(v_hour,v_minute);
        int cur=toMinute(hour,minute);
        int s=toMinute(s_hour,s_minute);
        int e=toMinute(e_hour,e_minute);

        if(cur>=s && cur<=e){
            cur=e;
        }

        for(String str:commands){
            if(str.equals("next")){
                cur+=10;
                if(cur>v_len) cur=v_len;
            }else{ //prev
                cur-=10;
                if(cur<0) cur=0;
            }

            if(cur>=s && cur<=e){
                cur=e;
            }

        }

        String h=String.valueOf(cur/60);
        String m=String.valueOf(cur%60);

        if(h.length()==1) h="0"+h;
        if(m.length()==1) m="0"+m;

        return h+":"+m;
    }

    static int toMinute(int h,int m){
        int minute=(h*60)+m;
        return minute;
    }
}

후기

분으로 바꿔 접근하니 훨씬 수월하게 풀렸다. 앞으로 문제를 바로 풀기보단 생각하는 시간을 오래 가지고 접근해야겠다.

profile
모바일 어플리케이션, cross platform과 iOS에 관심이 많은 개발자 오승연입니다

0개의 댓글