- 프로래머스 Lv1 [PCCP 기출문제] 1번 동영상 재생기 문제
- 해당 문제의 난이도 상승 원인
- 이동 전 / 이동 후 모두 오프닝 구간 체크가 필요
- 특정 구간 자동 스킵 조건이 존재
- 해당 문제를 해결한 방법
- 시간 이동 전/후를 검사하여 특정 구간에 들어가면 특별 처리하도록 기능 작성
- 문제의 핵심
- '특정 구간'이라는 곳에 대한 경계처리가 중요
- 이 문제의 목적
class VideoPlayer {
public String solution(String video_len, String pos, String op_start, String op_end, String[] commands) {
String answer = "";
// 코딩 진행 상황
// 입력값 전처리
int tSec = (Integer.parseInt(video_len.split(":")[0]) * 60) + Integer.parseInt(video_len.split(":")[1]);
int cSec = (Integer.parseInt(pos.split(":")[0]) * 60) + Integer.parseInt(pos.split(":")[1]);
int osSec = (Integer.parseInt(op_start.split(":")[0]) * 60) + Integer.parseInt(op_start.split(":")[1]);
int oeSec = (Integer.parseInt(op_end.split(":")[0]) * 60) + Integer.parseInt(op_end.split(":")[1]);
int weight = 10;
// commands 배열의 요소만큼 순환
for(String c : commands){
int setVal = (cSec >= tSec) ? tSec : cSec; // 비교값 계산
if(Math.max(osSec, Math.min(setVal, oeSec)) == setVal){
setVal = oeSec;
}
// c 에 따라 분기하여 처리
if(c.equals("prev")){
setVal -= weight;
if(setVal <= 0){
cSec = 0;
}
else if((setVal >= osSec) && (setVal <= oeSec)){
cSec = oeSec; // 비교값이 오프닝 구간에 위치 시 처리 및 비교값 할당
}
else{
cSec = setVal;
}
}
else if(c.equals("next")){
setVal += weight; // 비교값 계산
if(setVal >= tSec){
cSec = tSec; // 비교값이 전체 영상 길이 초과 시 처리 및 비교값 할당
}
else if((setVal >= osSec) && (setVal <= oeSec)){
cSec = oeSec; // 비교값이 오프닝 구간에 위치 시 처리 및 비교값 할당
}
else{
cSec = setVal; // 비교값 할당
}
}
}
int calSec = 60;
// 계산된 최종 재생구간 값 처리
answer =
String.format("%02d", cSec / calSec) + ":" + String.format("%02d", cSec % calSec);
return answer;
}
public static void main(String[] args) {
String video_len = "34:33";
String pos = "13:00";
String op_start = "00:55";
String op_end = "02:55";
String[] commands = {"next", "prev"};
VideoPlayer videoPlayer = new VideoPlayer();
System.out.println("결과 : " + videoPlayer.solution(video_len, pos, op_start, op_end, commands));
}
}