프로그래머스 동영상 재생기 JAVA 풀이 (구현, 시뮬레이션)

2026. 6. 28. 23:52·코테(Solved.ac + Programmers)
728x90

🔗 문제 링크

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr


📌 문제 개요

동영상의 현재 재생 위치에서 prev, next 명령을 수행하는 문제이다.

  • prev는 현재 위치에서 10초 전으로 이동한다.
  • next는 현재 위치에서 10초 후로 이동한다.
  • 현재 위치가 오프닝 구간(op_start ~ op_end)에 포함되면 자동으로 오프닝 종료 시점(op_end)으로 이동한다.

모든 명령을 수행한 뒤 최종 재생 위치를 "mm:ss" 형식으로 반환하면 된다.


📌 접근 방법

문자열 형태의 시간을 직접 계산하면 복잡해지므로 모든 시간을 초(second) 단위로 변환하여 처리한다.

먼저 시작 위치가 오프닝 구간인지 확인하고 필요하면 오프닝 종료 위치로 이동한다.

 

이후 모든 명령을 순서대로 수행하면서 처리한다

  • prev → 최대 0초까지 이동
  • next → 최대 영상 길이까지 이동

명령이 끝날 때마다 현재 위치가 오프닝 구간인지 다시 확인하여 자동으로 op_end로 이동시킨다.

마지막에는 초 단위를 다시 "mm:ss" 형식으로 변환하여 반환한다.


📌 핵심 아이디어

1. 시간을 초 단위로 변환

문자열 비교 대신 정수 계산으로 처리하면 훨씬 간단하다.

minute * 60 + second

2. prev / next 처리

pos = Math.max(0, pos - 10);
pos = Math.min(videoLen, pos + 10);

영상 범위를 벗어나지 않도록 처리한다.


3. 오프닝 자동 건너뛰기

명령 수행 후마다 반드시 확인해야 한다.

또한 초기 시작 위치도 먼저 검사해야 한다.

if (opStart <= pos && pos <= opEnd) {
    pos = opEnd;
}

4. 다시 mm:ss 형태로 변환

두 자리 형식을 유지하여 반환한다.

String.format("%02d:%02d", minute, second)

📌 전체 코드

class Solution {
    public String solution(String video_len, String pos, String op_start, String op_end, String[] commands) {
        int videoLen = toSecond(video_len);
        int current = toSecond(pos);
        int opStart = toSecond(op_start);
        int opEnd = toSecond(op_end);

        current = skipOpening(current, opStart, opEnd);

        for (String command : commands) {
            if (command.equals("prev")) {
                current = Math.max(0, current - 10);
            } else {
                current = Math.min(videoLen, current + 10);
            }

            current = skipOpening(current, opStart, opEnd);
        }

        return toTime(current);
    }

    private int toSecond(String time) {
        String[] arr = time.split(":");
        return Integer.parseInt(arr[0]) * 60 + Integer.parseInt(arr[1]);
    }

    private int skipOpening(int current, int opStart, int opEnd) {
        if (opStart <= current && current <= opEnd) {
            return opEnd;
        }

        return current;
    }

    private String toTime(int second) {
        int min = second / 60;
        int sec = second % 60;

        return String.format("%02d:%02d", min, sec);
    }
}
 

📄 정리

  • 시간을 문자열이 아닌 초 단위 정수로 변환하면 구현이 쉬워진다.
  • prev, next는 Math.max(), Math.min()으로 범위를 쉽게 처리할 수 있다.
  • 시작 위치와 명령 수행 후 모두 오프닝 구간을 확인해야 한다.
  • 구현 자체는 단순하지만 조건 처리 순서가 중요한 시뮬레이션 문제이다.
728x90

'코테(Solved.ac + Programmers)' 카테고리의 다른 글

프로그래머스 분수의 덧셈 JAVA 풀이 (수학, 구현, 유클리드 호제법)  (0) 2026.06.30
프로그래머스 로또의 최고 순위와 최저 순위 JAVA 풀이 (완전탐색, 구현)  (0) 2026.06.29
프로그래머스 햄버거 만들기 JAVA 풀이 (스택, 구현)  (0) 2026.06.27
프로그래머스 대충 만든 자판 JAVA 풀이 (HashMap, 구현)  (0) 2026.06.26
프로그래머스 정수를 나선형으로 배치하기 JAVA 풀이 (구현, 시뮬레이션)  (0) 2026.06.26
'코테(Solved.ac + Programmers)' 카테고리의 다른 글
  • 프로그래머스 분수의 덧셈 JAVA 풀이 (수학, 구현, 유클리드 호제법)
  • 프로그래머스 로또의 최고 순위와 최저 순위 JAVA 풀이 (완전탐색, 구현)
  • 프로그래머스 햄버거 만들기 JAVA 풀이 (스택, 구현)
  • 프로그래머스 대충 만든 자판 JAVA 풀이 (HashMap, 구현)
PUSH → MERGE → DEPLOY
PUSH → MERGE → DEPLOY
데이터 흐름과 운영 자동화를 설계하는 백엔드 개발자
  • PUSH → MERGE → DEPLOY
    Coding Dongin
    PUSH → MERGE → DEPLOY
  • 전체
    오늘
    어제
    • MEUN
      • 코테(Solved.ac + Programmers)
      • BootCamp(JAVA)
      • JAVA
      • SpringBoot
      • JavaScript
      • JSP
      • DB(SQL)
      • React
      • HTML_CSS
      • jQuery
      • SCSS
      • GSAP
      • 설치 + 꿀팁
      • 정보처리기사 오답노트
      • 정보처리기사 기출문제
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • GIT
  • 공지사항

  • 인기 글

  • 태그

    백준
    코딩테스트
    브루트포스
    정처기실기
    springboot
    피보나치
    기출문제
    문자열
    실기
    백엔드개발자
    java
    완전탐색
    수학
    시뮬레이션
    구현
    배열
    Level2
    정보처리기사 실기 기출문제
    알고리즘
    자료구조
    solved.ac
    정렬
    level0
    프로그래머스
    정처기오답노트
    자바
    level1
    dp
    정처기
    정보처리기사
  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.4
PUSH → MERGE → DEPLOY
프로그래머스 동영상 재생기 JAVA 풀이 (구현, 시뮬레이션)
상단으로

티스토리툴바