Programmers Lv.1 : [PCCP 기출문제] / 1번 동영상 재생기 [C]

문제

Programmers Lv.1 : [PCCP 기출문제] / 1번 동영상 재생기https://school.programmers.co.kr/learn/courses/30/lessons/340213


알고리즘

Input: 동영상의 길이(video_len), 기능 수행 전 재생위치(pos), 오프닝 시작점 (op_start),
오프닝 끝지점(op_end), 사용자 입력(commands[]), 사용자 입력 수 (commands_len)

  1. 각 Input으로 주어진 문자열 “MM:SS”를 초(s) 단위로 계산하여 반환1.1. 중간값 mid 계산
    1.1. “:” 를 기준으로 “MM:SS”중 MM를 초(s) 단위로 변환
    1.2. “MM:SS”중 SS를 초(s) 단위로 변환
    1.3. MM + SS를 초(s) 단위로 반환
  2. commands 입력에 따른 동작
    2.1. 현재 재생 위치가 오프닝 구간에 존재할 경우 pos = op_end
    2.2. prev 명령 입력
    2.3. next 명령 입력
    2.4. 현재 재생 위치가 오프닝 구간에 존재할 경우 pos = op_end
  3. 동영상의 위치(초)를 문자열 “MM:SS”로 계산하여 반환

Output: 명령 입력 후 동영상의 위치


소스코드

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>

/* Func: 문자열 "MM:SS"를 초(s) 단위로 계산하여 반환 */
int convert2sec(char* video_len){
    int sec = 0;
    char* token;    // 문자열을 나누기 위한 포인터
    /* 1. ":" 를 기준으로 "MM:SS"중 MM를 초(s) 단위로 변환 */
    token = strtok(video_len, ":");
    if(token != NULL)
        sec += atoi(token) * 60;
    
    /* 2. "MM:SS"중 SS를 초(s) 단위로 변환 */
    token = strtok(NULL, ":");
    if(token != NULL)
        sec += atoi(token);
    
    /* 3. MM + SS를 초(s) 단위로 반환 */
    return sec;
}

// commands_len은 배열 commands의 길이입니다.
// 파라미터로 주어지는 문자열은 const로 주어집니다. 변경하려면 문자열을 복사해서 사용하세요.
char* solution(const char* video_len, const char* pos, const char* op_start, const char* op_end, const char* commands[], size_t commands_len) {
    // return 값은 malloc 등 동적 할당을 사용해주세요. 할당 길이는 상황에 맞게 변경해주세요.

    /*============================*/
    /*            Input           */
    /* 동영상의 길이 video_len,    */
    /* 기능 수행 전 재생위치 pos,  */
    /* 오프닝 시작점 op_start,     */
    /* 오프닝 끝지점 op_end,       */
    /* 사용자 입력 commands[],     */
    /* 사용자 입력 수 commands_len */
    /*============================*/
    char* answer = (char*)malloc(6 * sizeof(char));
    memset(answer, '\0', 6 * sizeof(char));
    
    char tmp[5];
    int video_len_sec, pos_sec, op_start_sec, op_end_sec;
    
    /* 1. 각 Input으로 주어진 문자열 "MM:SS"를 초(s) 단위로 계산하여 반환 */
    video_len_sec = convert2sec(video_len);
    pos_sec = convert2sec(pos);
    op_start_sec = convert2sec(op_start);
    op_end_sec = convert2sec(op_end);
    
    /* 2. commands 입력에 따른 동작 */
    for(int i = 0; i < commands_len; i++){
        /* 2.1. 현재 재생 위치가 오프닝 구간에 존재할 경우 pos = op_end */
        if(op_start_sec <= pos_sec && pos_sec <= op_end_sec)
            pos_sec = op_end_sec;
        /* 2.2. prev 명령 입력 */
        if(!strcmp(commands[i], "prev")){
            if(pos_sec < 10)
                pos_sec = 0;
            else
                pos_sec -= 10;
        }
        /* 2.3. next 명령 입력 */
        else if(!strcmp(commands[i], "next")){
            if(pos_sec > (video_len_sec - 10))
                pos_sec = video_len_sec;
            else
                pos_sec += 10;
        }
        /* 2.4. 현재 재생 위치가 오프닝 구간에 존재할 경우 pos = op_end */
        if(op_start_sec <= pos_sec && pos_sec <= op_end_sec)
            pos_sec = op_end_sec;
    }
    
    /* 3. 동영상의 위치(초)를 문자열 "MM:SS"로 계산하여 반환 */
    sprintf(tmp, "%02d", pos_sec / 60);
    strcat(answer, tmp);
    strcat(answer, ":");
    sprintf(tmp, "%02d", pos_sec % 60);
    strcat(answer, tmp);

    /* Output: 명령 입력 후 동영상의 위치 */
    printf("answer: %s", answer);
    
    
    return answer;
}

Leave a Comment