728x90
반응형
https://school.programmers.co.kr/learn/courses/30/lessons/340213
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
문제유형
- 문자열
문제 난이도
- Lev1
문제 분석
1. 현재 시간이 오프닝 시작 시간과 종료 시간 사이에 있을 경우, 오프닝 건너 뛰기를 통해서, 종료 시간으로 변경해준다.
2. "next"의 경우, 현재 시간에서 10초 뒤로, "prev"의 경우, 10초 앞으로 당긴다.
3. 만약 "next"를 통해 video_len(동영상 총 길이)를 넘어설 경우, 영상의 마지막 위치(video_len)로 이동시킨다.
4. 만약 "prev"를 통해 10초 미만인 경우, 영상의 처음 위치(0분 0초)로 이동시킨다.
문제 풀이
처음에 문제 풀이를 진행할 때, 각 자리마다 연산을 진행했었는데, 이러다보니 엣지 케이스와 에러가 많이 생겼고, 쓸데없는 중복 코드들이 너무 많이 생겼다. 따라서 힌트를 받아, 다음과 같이 현재 시간들을 모두 초로 바꾼 뒤, 계산을 진행하고 마지막에 "mm:ss" 형식으로 변환해줬다.
전체 코드
import java.util.*;
import java.io.*;
class Solution {
public String solution(String video_len, String pos, String op_start, String op_end, String[] commands) {
int maxSec = toSec(video_len);
int curSec = toSec(pos);
int opS = toSec(op_start);
int opE = toSec(op_end);
if(curSec >= opS && curSec <= opE) {
curSec = opE;
}
for(String cmd : commands) {
curSec += cmd.equals("next") ? 10 : -10;
curSec = Math.max(0, Math.min(curSec, maxSec));
if(curSec >= opS && curSec <= opE) curSec = opE;
}
return toTime(curSec);
}
static int toSec(String time) {
String[] times = time.split(":");
return Integer.parseInt(times[0]) * 60 + Integer.parseInt(times[1]);
}
static String toTime(int sec) {
int m = sec / 60, s = sec % 60;
return String.format("%02d:%02d", m, s);
}
}
728x90
반응형