상세 컨텐츠

본문 제목

[PCCP 기출문제] 1번/ 동영상 재생기 -파이썬

본문

728x90
반응형

# 함수는 위에다가 만들어서 사용해야 한다.
# mm:ss 문자열을 -> 초로 변환하는 기능
def time_to_seconds(time_str):
    minutes, seconds = map(int, time_str.split(':'))
    return minutes * 60 + seconds
    # mm의 *60 + ss = 
    #map()함수, split()함수
# 초를 인자로 전달하면 -> mm:ss 문자열로 변환 하는 기능
def seconds_to_time(seconds):
    minutes = seconds // 60
    seconds = seconds % 60
    return f"{minutes:02}:{seconds:02}"
    # // , % 연산 
def solution(video_len, pos, op_start, op_end, commands):
    # 동영상 길이와 현재 위치를 초로 변환
    video_length = time_to_seconds(video_len)
    current_position = time_to_seconds(pos)
    opening_start = time_to_seconds(op_start)
    opening_end = time_to_seconds(op_end)
    # command라는 변수가 commands라는 시퀸스 동안에 실시한다.
    for command in commands:
        # command가 "prev" 명령어인 경우 현재 위치에서 -10s 가 현재 위치로 할당
        if command == "prev":
            current_position = max(0, current_position - 10)
        # command가 "next"명령어인 경우 현재 위치에서 +10s 가 현재 위치로 할당
        elif command == "next":
            current_position = min(video_length, current_position + 10)
        # command가 "skip"명령어인 경우 
        # 현재 재생 위치가 오프닝 구간인 경우 현재 재생위치가 엔딩 구간을 할당받는다.
        elif command == "skip":
            if opening_start <= current_position <= opening_end:
                current_position = opening_end

    # 최종 위치를 "mm:ss" 형식으로 변환하여 반환
    return seconds_to_time(current_position)

<--- 이건 틀린것...

오프닝 구간인지 확인하는 과정이

현재 시간을 명령어 전에 한번 확인하고
명령어 이후에도 현재 위치에 따라서 이동이 되기 때문에 


next 명령과 prev명령 위 아래에 위치시켜야한다. <- 중요 포인트

정확한 코드는 아래와 같다.

def time_to_seconds(time_str):
    """ mm:ss 형식의 시간을 초로 변환 """
    minutes, seconds = map(int, time_str.split(':'))
    return minutes * 60 + seconds

def seconds_to_time(seconds):
    """ 초를 mm:ss 형식으로 변환 """
    minutes = seconds // 60
    seconds = seconds % 60
    return f"{minutes:02}:{seconds:02}"

def solution(video_len, pos, op_start, op_end, commands):
    # 동영상 길이와 현재 위치를 초로 변환
    video_length = time_to_seconds(video_len)
    current_position = time_to_seconds(pos)
    opening_start = time_to_seconds(op_start)
    opening_end = time_to_seconds(op_end)
    
    for command in commands:
        # 오프닝 구간인지 확인하고 이동
        if opening_start <= current_position <= opening_end:
            current_position = opening_end  # 오프닝 끝으로 이동

        # 현재 위치가 오프닝 구간이 아닌 경우에만 명령어 실행
        if command == "prev":
            current_position = max(0, current_position - 10)  # 10초 전으로 이동, 최소 0초
        elif command == "next":
            current_position = min(video_length, current_position + 10)  # 10초 후로 이동, 최대 동영상 길이

        # 오프닝 구간인지 다시 확인하고 이동
        if opening_start <= current_position <= opening_end:
            current_position = opening_end  # 오프닝 끝으로 이동

    # 최종 위치를 "mm:ss" 형식으로 변환하여 반환
    return seconds_to_time(current_position)

 

 

<동영상 재생기 알고리즘을 파이썬으로 풀어나가기 위해서 알아야 할 메소드 목록>

 

iterable 은 파이썬에서 반복 가능한 객체를 의미 
예를 들어서 반복문을 사용하여 객체 요소를 하나씩 순환 가능한 

리스트, 튜플,문자열,딕셔너리,집합 등이 이에 해당합니다.
 추가로 알아야 할 단어로는 iterator도 있습니다.
반복 가능한 객체에서 각각의 하나씩의 요소를 지닌 상태를 의미합니다.
보통 iterable 객체에서 iter() 함수를 호출하여 생성된 객체이며,
iterator은 _next_() 메서드를 사용하여
한 번에 하나의 요소를 반환 할 수 있다고 합니다.

 

# iterable과 iterator의 예
my_list = [1, 2, 3]
my_iterator = iter(my_list)  # iterable에서 iterator 생성

print(next(my_iterator))  # 1
print(next(my_iterator))  # 2
print(next(my_iterator))  # 3
# print(next(my_iterator))  # StopIteration 오류 발생  <- 더 이상 나올 요소 존재 X

1. map()함수  

: map() 함수는 주어진 함수를 iterable의 모든 요소에 적용하여 새로운 iterable을 반환한다.

반환되는 값은 map객체로, 리스트로 변환 가능하다.

 

사용예시

# 1. 기본 사용법
def square(x):
    return x ** 2

numbers = [1, 2, 3, 4]
squared_numbers = map(square, numbers)
print(list(squared_numbers))  # 출력: [1, 4, 9, 16]

# 2. 람다 함수와 함께 사용
numbers = [1, 2, 3, 4]
squared_numbers = map(lambda x: x ** 2, numbers)
print(list(squared_numbers))  # 출력: [1, 4, 9, 16]

# 3. 여러 iterable을 동시에 다루기 
a = [1, 2, 3]
b = [4, 5, 6]
summed = map(lambda x, y: x + y, a, b)
print(list(summed))  # 출력: [5, 7, 9]

2. split()함수

: split() 함수는 문자열을 지정한 구분자로 나누어 리스트로 반환한다. 
기본값으로는 ''공백을 구분자로 사용한다.

 

사용예시

# 1. 기본 사용법
text = "안녕하세요 여러분"
words = text.split()  # 기본적으로 공백을 기준으로 나눕니다.
print(words)  # 출력: ['안녕하세요', '여러분']

# 2. 특정 구분자 나누기
csv_line = "apple,banana,cherry"
fruits = csv_line.split(",")  # 쉼표를 기준으로 나눕니다.
print(fruits)  # 출력: ['apple', 'banana', 'cherry']

# 3. 제한된 개수로 나누기
text = "one two three four"
limited_split = text.split(" ", 2)  # 두 번만 나눕니다.
print(limited_split)  # 출력: ['one', 'two', 'three four']

+Split()함수와 map()함수 함께 사용하는 예시+

# 문자열을 정수로 변환하기
numbers_str = "1 2 3 4 5"
numbers = map(int, numbers_str.split())  # 문자열을 나누고 각 요소를 정수로 변환
print(list(numbers))  # 출력: [1, 2, 3, 4, 5]

 

 

3. 파이썬에서 사용하는 연산자 목록
: 코드에서 사용한 '//' 연산자는 a // b = a / b 와 같고, 소숫점을 버리고 정수 몫만을 가진다.

 

파이썬에서 사용하는 연산자 종류

 

4. max()함수

: 주어진 인자 중에서 최소값을 반환하는 함수

5. min()함수

: 주어진 인자 중에서 최대값을 반환하는 함수

 


 min() 함수와 max() 함수는 다양한 데이터 타입에서 최소값과 최대값을 쉽게 찾을 수 있도록 도와준다.

*참고로 위의 알고리즘 문제에서 max(0, 현재영상위치 -10) 과 같이 설정했을 때는 
현재영상위치가 07초이면 -3이니깐 가장 큰 값이 0이다.
즉, 영상에서 음수는 없으니깐, 0으로 할당해주기 위해서 값의 범위를 지정한 것.

< 동영상 재생기 알고리즘을 파이썬으로 풀어나가기 위해서 알아야 할  파이썬 문법>

 

1. if - elif 

** Python**

if condition1:
    # 실행할 코드
elif condition2:
    # 실행할 코드
else:
    # 실행할 코드

대뜸 Delphi 튀어나오고, 아무래도 파이썬에서 쓰는 elif는 'else if'의 축약어인 것 같다.
그럼 다른 언어들은 조건문을 어떤 형태로 쓰는지 잠시 정리해봐야겠다.
** Delphi**

if <조건> then
being
	<참일 때 실행코드> ;
end else
being
	<거짓일 때 실행코드>
end;

** C/C++ , JAVA, JAVAScript **

if (condition1) {
    // 실행할 코드
} else if (condition2) {
    // 실행할 코드
} else {
    // 실행할 코드
}

** PHP**

if ($condition1) {
    // 실행할 코드
} elseif ($condition2) {
    // 실행할 코드
} else {
    // 실행할 코드
}

 

 

** Ruby**

if condition1
    # 실행할 코드
elsif condition2
    # 실행할 코드
else
    # 실행할 코드
end
728x90
반응형

관련글 더보기