오늘 풀어볼 문제는 PCCP 기출문제로, 동영상 재생기라는 문제를 풀어보겠습니다.
https://school.programmers.co.kr/learn/courses/30/lessons/340213
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
동영상 재생기 : 출처 "프로그래머스 코딩 테스트 연습,
https://programmers.co.kr/learn/challenges
문제를 정리해 보면 아래와 같은 조건과, 제한 사항 및 매개변수에 대한 설명을 정리할 수 있습니다.
조건
- 기능 3가지
- prev 명령어 : 재생 위치를 현재 위치에서 10초 전으로 이동. (단, 현재 위치가 0보다 작을 경우 동영상의 처음으로 이동)
- next 명령어 : 재생 위치를 현재 위치에서 10초 후로 이동(단, 영상의 길이보다 현재위치가 커질 경우 동영상의 마지막으로 이동)
- 오프닝 건너뛰기 : 현재 재생위치가 오프닝 구간(op_start <= 현재 재생 위치 <= op_end)인 경우 오프닝이 끝나는 위치로 이동.
- 제한 사항
- 동영상의 시점은 string으로 전달되며 "mm:ss"형태로 전달됨. (mm분, ss초)
- 0 <= mm <= 59
- 0 <= ss <= 59
- 분, 초가 한자리일 경우 0을 붙여 두 자리로 표현
매개 변수
- video_len : 비디오의 전체 길이
- pos : 파라미터로 전달되는 명령(prev, next)이 시작되기 전의 재생 위치
- op_start : 오프닝 시작시간
- op_end : 오프닝 종료 시간
풀이 과정
선택된 자료구조 or 자료형
동영상의 시점(현재 위치, 오프닝 시작시간, 종료시간), 동영상의 길이가 현재 string 타입의 mm:ss 포맷을 따르고 있어, 이를 코드 상에서 연산하기 쉬운 형태인 int형으로 치환하고자 하였고, 전체 ss(int) 초 형태로 변환을 진행하였습니다.
- 각 파라미터의 길이 : int형의 분, 초를 합산한 N 초 형태를 활용
Why?
해당 방식을 선택하게 된 이유는 C#에서 제공해 주는 mm:ss 형태를 DateTime이나, TimeSpan을 활용할 수 있으나, 코딩 테스트 문제 특성상, IDE(Integrated Development Environment) 없이 컴파일부터 시작하여, 문법에 대해 이해도가 중요하여, 해당 자료형을 활용하는 데에 있어, 지식이 부족하다고 판단하여, 더 간단한 C# 문법을 활용한 int값만으로 비교해도 문제없다고 판단하였습니다.
각 파라미터 데이터 치환
public string solution(string video_len, string pos, string op_start, string op_end, string[] commands) {
int videoLength = GetTimeFromString(video_len);
int currentVideoPos = GetTimeFromString(pos);
int openingStart = GetTimeFromString(op_start);
int openingEnd = GetTimeFromString(op_end);
}
private int GetTimeFromString(string time)
{
string[] times = time.Split(':');
return int.Parse(times[0]) * 60 + int.Parse(times[1]);
}
각 파라미터들을 int(시간초)로 변환하기 위해, 별도의 함수로 정의하여, 이를 재사용하여, 의미하는 변수에 할당하여 데이터를 활용하였습니다.
문제에서 제시된 조건 대입
오프닝 건너뛰기
currentVideoPos = IsRangeValue(currentVideoPos) ? openingEnd : currentVideoPos;
private bool IsRangeValue(int currentValue, int RangeStart, int RangeEnd)
{
return RangeStart <= currentValue && currentValue <= RangeEnd;
}
//각 명령어가 실행된 이후 현재 비디오 타이머를 비교하여, 재생 시점 재조정
if (currentVideoPos < 0)
currentVideoPos = 0;
if (currentVideoPos >= videoLength)
currentVideoPos = videoLength;
현재 재생 위치가 오프닝 구간인 경우 항상 오프닝 종료 시점으로 이동한다.
명령어가 실행되기 이전과, 명령어가 한번 실행될 때마다 동영상 시점을 확인하여 현재 위치를 변경
Prev 명령어, Next 명령어
최초에 명령어 String을 Enum으로 활용하여. String을 통해 Enum값에 대입하여, 시간초를 가져오려고 하였으나,
문법을 명확히 이해하지 못해String을 통해 시간초를 가져올 수 있게 변경하고, 이를 현재 비디오 타이머에 적용하여 문제를 풀어 나가기 시작하였습니다.
최종 비디오 재생 시점에 대한 Return
private string GetStringFromTime(int time)
{
int min = time / 60;
int sec = time % 60;
return min.ToString("D2") + ":" + sec.ToString("D2");
}
이번 문제를 마치며..
이번 문제를 풀었을 때는 자료구조를 결정하거나, 조건을 대입하는데 크게 어려움이 없었습니다. 하지만, 문제를 풀면서, 사용하고 싶은 자료구조를 활용함에 있어 IDE 없이 언어 문법을 활용하는데 제약사항이 있다는 것을 새삼 느끼게 되었습니다. 그리하여, 문제를 풀면서, 아쉬웠던 문법, 활용하는데 어려움이 있는 문법을 정리하고 이를 다루는 주제를 추가적으로 작성해보고자 합니다.
부족했던 문법
- String To int Parse
- int To String (2자리 포맷)
- String To Enum Parse
- Split String To Array (문자열 구분자로, Array로 변환)
'코딩테스트' 카테고리의 다른 글
[코딩 테스트] 가장 많이 받은 선물 (1) | 2025.07.02 |
---|