[프로그래머스] [PCCP 기출문제] 1번 / 동영상 재생기

2026. 7. 24. 14:58코딩테스트

728x90
반응형

 

 

오랜만에 다시 프로그래밍을 시작해보았다.

문제 설명

 

당신은 동영상 재생기를 만들고 있습니다. 당신의 동영상 재생기는 10초 전으로 이동, 10초 후로 이동, 오프닝 건너뛰기 3가지 기능을 지원합니다. 각 기능이 수행하는 작업은 다음과 같습니다.

  • 10초 전으로 이동: 사용자가 "prev" 명령을 입력할 경우 동영상의 재생 위치를 현재 위치에서 10초 전으로 이동합니다. 현재 위치가 10초 미만인 경우 영상의 처음 위치로 이동합니다. 영상의 처음 위치는 0분 0초입니다.
  • 10초 후로 이동: 사용자가 "next" 명령을 입력할 경우 동영상의 재생 위치를 현재 위치에서 10초 후로 이동합니다. 동영상의 남은 시간이 10초 미만일 경우 영상의 마지막 위치로 이동합니다. 영상의 마지막 위치는 동영상의 길이와 같습니다.
  • 오프닝 건너뛰기: 현재 재생 위치가 오프닝 구간(op_start ≤ 현재 재생 위치 ≤ op_end)인 경우 자동으로 오프닝이 끝나는 위치로 이동합니다.

동영상의 길이를 나타내는 문자열 video_len, 기능이 수행되기 직전의 재생위치를 나타내는 문자열 pos, 오프닝 시작 시각을 나타내는 문자열 op_start, 오프닝이 끝나는 시각을 나타내는 문자열 op_end, 사용자의 입력을 나타내는 1차원 문자열 배열 commands가 매개변수로 주어집니다. 이때 사용자의 입력이 모두 끝난 후 동영상의 위치를 "mm:ss" 형식으로 return 하도록 solution 함수를 완성해 주세요.


제한사항
  • video_len의 길이 = pos의 길이 = op_start의 길이 = op_end의 길이 = 5
    • video_len, pos, op_start, op_end는 "mm:ss" 형식으로 mm분 ss초를 나타냅니다.
    • 0 ≤ mm ≤ 59
    • 0 ≤ ss ≤ 59
    • 분, 초가 한 자리일 경우 0을 붙여 두 자리로 나타냅니다.
    • 비디오의 현재 위치 혹은 오프닝이 끝나는 시각이 동영상의 범위 밖인 경우는 주어지지 않습니다.
    • 오프닝이 시작하는 시각은 항상 오프닝이 끝나는 시각보다 전입니다.
  • 1 ≤ commands의 길이 ≤ 100
    • commands의 원소는 "prev" 혹은 "next"입니다.
    • "prev"는 10초 전으로 이동하는 명령입니다.
    • "next"는 10초 후로 이동하는 명령입니다.

입출력 예video_lenposop_startop_endcommandsresult
"34:33" "13:00" "00:55" "02:55" ["next", "prev"] "13:00"
"10:55" "00:05" "00:15" "06:55" ["prev", "next", "next"] "06:55"
"07:22" "04:05" "00:15" "04:07" ["next"] "04:17"

입출력 예 설명

입출력 예 #1

  • 시작 위치 13분 0초에서 10초 후로 이동하면 13분 10초입니다.
  • 13분 10초에서 10초 전으로 이동하면 13분 0초입니다.
  • 따라서 "13:00"을 return 하면 됩니다.

입출력 예 #2

  • 시작 위치 0분 5초에서 10초 전으로 이동합니다. 현재 위치가 10초 미만이기 때문에 0분 0초로 이동합니다.
  • 0분 0초에서 10초 후로 이동하면 0분 10초입니다.
  • 0분 10초에서 10초 후로 이동하면 0분 20초입니다. 0분 20초는 오프닝 구간이기 때문에 오프닝이 끝나는 위치인 6분 55초로 이동합니다. 따라서 "06:55"를 return 하면 됩니다.

입출력 예 #3

  • 시작 위치 4분 5초는 오프닝 구간이기 때문에 오프닝이 끝나는 위치인 4분 7초로 이동합니다. 4분 7초에서 10초 후로 이동하면 4분 17초입니다. 따라서 "04:17"을 return 하면 됩니다.

 

 

 

 

처음 생각했던 접근방식

오랜만에 다시 코테를 풀어보니, 라이브러리 함수등을 이용하는 과정에서 문법 실수가 많았고,

예전같으면 바로 풀 수 있는 문제도 조금씩 돌아가서 생각하는 것 같았다.

특히 이 문제는 시간이 문자열로 주어지고 시간 계산하는 대표적인 문항이지만,

순간적으로 시간은 시간끼리, 분은 분끼리 계산하려는 안좋은 생각을 가졌다.

 

그래도 평소에 수학을 공부한 것이 도움이 되어서 그냥 시간을 분으로 맞춰서 계산하고,

나중에 /60, %60을 통해서 시간과 분으로 다시 나누어 주면 될 것이라고 빠르게 사고를 전환할 수 있었다.

 

 

 

 

풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <string>
#include <vector>
#include <sstream>
#include <iostream>
#include <algorithm>
 
using namespace std;
 
int GetTime(const string hour);
void SkipOpening(int& cur, int start, int end);
 
string solution(string video_len, string pos, string op_start, string op_end, vector<string> commands) {
    string answer = "";
    
    int csize = commands.size();
    
    int op_stime = GetTime(op_start);
    int op_etime = GetTime(op_end);
    int cur_time = GetTime(pos);
    int vi_time = GetTime(video_len);
    
    
    for(int i=0; i<csize; i++){
        
        SkipOpening(cur_time, op_stime, op_etime);
        
        if(commands[i] == "next"){
            cur_time = min(vi_time, cur_time+10);
        }else{
            cur_time = max(0, cur_time-10);
        }
        
        SkipOpening(cur_time, op_stime, op_etime);
        
    }
    
    string res_hour = to_string(cur_time/60);
    string res_min = to_string(cur_time%60);
    
    if(cur_time/60 < 10){
        res_hour = '0' + res_hour;
    }
    if(cur_time%60 < 10){
        res_min = '0' + res_min;
    }
    
    answer = res_hour + ":" + res_min;
    return answer;
}
 
int GetTime(string hour){
    int get_hour = stoi(hour.substr(0,2));
    int get_min = stoi(hour.substr(3,2));
    int get_time = get_hour*60 + get_min;
    
    return get_time;
}
 
void SkipOpening(int& cur, int start, int end){
    if(start <= cur && cur <= end){
        cur = end;
    }
}
cs

 

오랜만에 다시 공부하는 것이었기에 부족하지만 min, max 함수, const와 참조 등을 다시 써보면서

단순 코딩테스트만을 위한 코드가 아니라 실제 실무에서 사용할 수 있는 코드등을 꾸준히 연습해 놓겠다.

아직 이 코드도 리팩토링이 더 필요하지만, 많은 문제를 풀면서 계속해서 깔끔한 코드를 쓸 수 있도록 하겠다.

 

 

 

 

반응형