본문 바로가기

programmers

프로그래머스 [PCCP 기출문제] 1번 / 동영상 재생기(C++) -yes6686- 티스토리

728x90
SMALL

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


문제 설명:

동영상의 길이와 현재 재생 위치, 조작 가능한 구간 및 사용자 조작 리스트가 주어질 때, 조작이 끝난 후의 최종 재생 위치를 반환하는 문제입니다. 재생 위치는 특정 구간에서 강제로 끝 지점으로 이동하거나 동영상의 시작과 끝을 넘을 수 없습니다.


문제 해결 코드


#include <iostream>
#include <string>
#include <vector>

using namespace std;

// 시간 문자열을 초 단위로 변환하는 함수
int cal(string s) {
    int sum = 0;
    string temp = "";
    
    for (char ch : s) {
        if (ch == ':') {
            sum += stoi(temp) * 60;  // 분 단위 변환
            temp = "";
        } else {
            temp += ch;
        }
    }
    sum += stoi(temp);  // 초 단위 추가
    return sum;
}

string solution(string video_len, string pos, string op_start, string op_end, vector c) {
    int len = cal(video_len);    // 동영상 전체 길이를 초 단위로 변환
    int p = cal(pos);            // 현재 재생 위치를 초 단위로 변환
    int st = cal(op_start);      // 조작 불가능 구간 시작점
    int en = cal(op_end);        // 조작 불가능 구간 끝점
    
    // 초기 위치가 조작 불가능 구간 내에 있는 경우
    if (st <= p && p <= en) {
        p = en;  // 강제로 끝 지점으로 이동
    }
    
    // 사용자 조작 처리
    for (string command : c) {
        if (command == "next") {
            p += 10;  // 10초 앞으로
            if (p > len) {
                p = len;  // 동영상 끝 초과 방지
            }
        } else {
            p -= 10;  // 10초 뒤로
            if (p < 0) {
                p = 0;  // 동영상 시작 초과 방지
            }
        }
        // 조작 불가능 구간 내에 들어가면 끝 지점으로 이동
        if (st <= p && p <= en) {
            p = en;
        }
    }
    
    // 초 단위를 "MM:SS" 형식의 문자열로 변환
    string ans = "";
    int minutes = p / 60;
    int seconds = p % 60;
    
    ans += (minutes < 10 ? "0" : "") + to_string(minutes);
    ans += ":";
    ans += (seconds < 10 ? "0" : "") + to_string(seconds);
    
    return ans;
}

코드 설명

  • 핵심 알고리즘: 입력된 시간을 초 단위로 변환하여 조작 과정을 쉽게 구현합니다. 각 조작이 끝날 때마다 재생 위치를 업데이트하며, 조작 불가능 구간에 들어갈 경우 강제로 끝 지점으로 이동합니다.
  • 구현 세부사항:
    • `cal` 함수는 "MM:SS" 형식의 시간을 초 단위로 변환하여 연산을 단순화합니다.
    • 현재 위치가 조작 불가능 구간에 들어가면 강제로 `op_end`로 이동합니다.
    • 사용자 입력 조작("next" 또는 "prev")에 따라 위치를 업데이트하며, 동영상 시작과 끝을 초과하지 않도록 조건문으로 처리합니다.
    • 최종 위치를 "MM:SS" 형식으로 변환하여 반환합니다.
  • 시간 복잡도 분석:
    • 입력 시간 변환: O(1)
    • 사용자 조작 처리: O(n), 여기서 n은 `c`의 크기
    • 최종 반환 문자열 변환: O(1)
    • 총 시간 복잡도: O(n)

결과

코드는 동영상 길이, 현재 위치, 조작 구간 및 사용자 입력 리스트를 기반으로 정확히 최종 위치를 계산합니다. 단순하고 효율적인 로직으로 구현되었습니다.

다른 접근 방식으로, 모든 조작을 시뮬레이션하지 않고 조작 리스트를 분석하여 최종 위치를 계산하는 방법이 있습니다. 이는 큰 입력 크기에 대해 성능을 개선할 수 있습니다.

728x90
LIST