N
(프로그래머스 c++) [PCCP 기출문제] 1번 / 동영상 재생기 본문
https://school.programmers.co.kr/learn/courses/30/lessons/340213
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
#include <string>
#include <vector>
#include <iostream>
using namespace std;
vector<string> splitTime(string time) {
vector<string> tokens;
size_t pos = 0;
string token;
string delimiter = ":";
while ((pos = time.find(delimiter)) != string::npos) {
token = time.substr(0, pos);
tokens.push_back(token);
time.erase(0, pos + delimiter.length());
}
tokens.push_back(time);
return tokens;
}
int changeToSeconds(string time) {
vector<string> splited_time = splitTime(time);
return (stoi(splited_time[0]) * 60) + (stoi(splited_time[1]));
}
string stringFormat(int time) {
if (time < 10) {
return "0" + to_string(time);
}
return to_string(time);
}
string changeToString(int seconds) {
int m = seconds / 60;
int s = seconds % 60;
return stringFormat(m) + ":" + stringFormat(s);
}
bool isInRange(int end_seconds, int pos_seconds) {
return pos_seconds >= 0 && pos_seconds <= end_seconds;
}
bool isInOpening(int op_start_seconds, int op_end_seconds, int pos_seconds) {
return pos_seconds >= op_start_seconds && pos_seconds <= op_end_seconds;
}
string solution(string video_len, string pos, string op_start, string op_end, vector<string> commands) {
int video_len_seconds = changeToSeconds(video_len);
int pos_seconds = changeToSeconds(pos);
int op_start_seconds = changeToSeconds(op_start);
int op_end_seconds = changeToSeconds(op_end);
pos_seconds = isInOpening(op_start_seconds, op_end_seconds, pos_seconds) ? op_end_seconds : pos_seconds;
for(auto command : commands) {
if (command == "prev") {
if (isInRange(video_len_seconds, pos_seconds - 10)) {
pos_seconds -= 10;
} else {
pos_seconds = 0;
}
} else {
if (isInRange(video_len_seconds, pos_seconds + 10)) {
pos_seconds += 10;
} else {
pos_seconds = video_len_seconds;
}
}
if (isInOpening(op_start_seconds, op_end_seconds, pos_seconds)) {
pos_seconds = op_end_seconds;
}
}
return changeToString(pos_seconds);
}
중복 코드를 방지하기 위해 미리 함수를 정해놨다.
함수 설명
1. splitTime : 하나의 string으로 되어있는 시간 format을 ":"을 기준으로 parsing한다. 리턴값은 vector형태의 string이며, [분, 초] 가 리턴된다.
2. changeToSeconds : string으로 되어있는 시간을 int 타입의 seconds를 리턴한다. seconds로 바꾼 이유는 계산을 쉽게 하기 위함이다.
3. changeToString : int 타입으로 되어있는 seconds를 "mm:ss"로 리턴한다.
4. isInRange : 앞/뒤로 건너뛰었을 때의 결과가 0 ~ video_len_seconds 이내인지 확인한다.
5. isInOpening: 앞/뒤로 건너뛰었을 때의 결과가 opening 중인지 확인한다.
코드 설명
1. 우선 주어진 모든 string 타입의 시간들을 모두 int 타입의 seconds로 바꿔준다.
2. seconds로 바꾼 pos가 opening 타임라인에 있는지 확인한다. 만약 opening 중이라면 op_end_seconds로 이동하고, 아니라면 그대로 keep.
3. commands를 하나씩 확인한다.
- prev : (pos_seconds - 10)을 해서 isInRange 함수를 call. 만약 false가 리턴된다면 이는 0보다 작다는 의미가 됨으로 영상의 처음 위치인 0으로 이동한다. true라면 (pos_seconds - 10)로 값을 업데이트.
- next : (pos_seconds + 10)을 해서 IsInRange 함수를 call. 만약 false가 리턴된다면 이는 영상의 길이보다 크다는 의미이므로 영상의 끝 위치인 video_len_seconds로 이동. true라면 (pos_seconds + 10)로 값을 업데이트.
- 하나의 command가 끝날 때마다 업데이트 한 pos_seconds가 opening 중인지 확인한다. opening 중이라면 op_end_seconds로 값을 다시 업데이트 한다.
4. changeToString 함수를 call하여 결과를 리턴하면 끝.
'프로그래머스 알고리즘 > 0 & 1단계' 카테고리의 다른 글
| (프로그래머스 c++) 삼총사 (0) | 2025.10.09 |
|---|---|
| (프로그래머스 c++) 숫자 짝꿍 (0) | 2025.10.08 |
| (프로그래머스 C++)상자 꺼내기 (3) | 2025.07.27 |
| (프로그래머스 c++) [PCCE 기출문제] 5번 / 심폐소생술 (0) | 2025.07.26 |
| (프로그래머스 c++)[PCCE 기출문제] 4번 / 병과분류 (0) | 2025.07.26 |