개발/알고리즘
[PCCP 기출문제] 1번 / 동영상 재생기
개발자_티모
2025. 4. 28. 08:03
반응형
문제 이해하기
- next 연산이 있을 시 + 10초
- prev 연산이 있을 시 - 10초
- 다만 최소 0초에서 최대 video_len 까지만 이동이 가능함
- 오프닝 구간에 있을 경우에는 오프닝의 마지막 시간으로 이동해야 한다.
문제 해결 방법 설명하기
1. 초로 통일
코드
function changeSec(time){
let [min, sec] = time.split(':').map(Number)
return min * 60 + sec
}
function secToMin(time){
min = Math.floor(time / 60)
sec = time % 60
if(min < 10){
min = `0${min}`
}
if(sec < 10){
sec = `0${sec}`
}
return `${min}:${sec}`
}
function solution(video_len, pos, op_start, op_end, commands) {
var answer = '';
video_len = changeSec(video_len)
pos = changeSec(pos)
op_start = changeSec(op_start)
op_end = changeSec(op_end)
for (let command of commands){
if (op_start <= pos && pos <= op_end){
pos = op_end
}
if (command === 'prev'){
pos = Math.max(pos - 10, 0)
}
if(command === 'next'){
pos = Math.min(pos + 10, video_len)
}
}
if (op_start <= pos && pos <= op_end){
pos = op_end
}
return secToMin(pos);
}
코드 리뷰
function toSeconds(time) {
const [minute, second] = time.split(":");
return minute * 60 + Number(second);
}
function solution(video_len, pos, op_start, op_end, commands) {
let position = toSeconds(pos);
const videoLen = toSeconds(video_len);
const opStart = toSeconds(op_start);
const opEnd = toSeconds(op_end);
if (opStart <= position && position <= opEnd) position = opEnd;
commands.forEach((command) => {
position += command === "next" ? 10 : -10;
position = Math.max(0, Math.min(position, videoLen));
if (opStart <= position && position <= opEnd) position = opEnd;
});
const minute = Math.floor(position / 60).toString().padStart(2, "0");
const second = (position % 60).toString().padStart(2, "0");
return minute + ":" + second;
}
배운점 정리하기
나의 코드를 확인해보면 오프닝 구간을 건너띄기 위해서 매번 계산하고 있는데, 잘 생각해보면 그럴 필요가 없다
for 진입 전에 오프닝 구간인지를 판별한 후, 반복문이 끝나는 구간에서 오프닝 구간 판별 연산을 수행하게 된다면, 항상 오프닝 인지 판별될 수 있기 때문에 불필요한 코드를 줄일 수 있다.
또한 padStart 문법 역시 잘 배웠다.
반응형