파이썬 알고리즘 첫걸음: 입출력과 시간 복잡도
1 / 7

Lesson 201. 소개 및 시간 복잡도

Guide to Competitive Programming 1장 & CP-Python 1장 통합 슬라이드입니다. - 파이썬 기본 입출력 최적화 기법 - 자료형별 Big-O 시간 복잡도 분석 - 첫 번째 과제 해결 (이상한 알고리즘)

수업 목표 및 동기부여

- 파이썬의 표준 입출력과 고속 입출력의 구조적 성능 차이를 학습합니다. - 대용량 데이터 처리 시 입출력 병목으로 인한 TLE를 예방합니다. - 주요 파이썬 컨테이너 연산들의 시간 복잡도를 명확히 파악합니다. - CSES 8000번~8004번 문제를 설계하고 파이썬으로 구현합니다.

고속 입출력 기법

sys 모듈을 활용하여 대규모 입력을 버퍼를 통해 한 번에 읽어들입니다.
import sys

# 1. 한 줄 읽고 줄바꿈 제거
line = sys.stdin.readline().rstrip()

# 2. 공백으로 구분된 다수의 정수 읽기
a, b, c = map(int, sys.stdin.readline().split())

# 3. 고속 출력 처리
sys.stdout.write(str(a) + "\n")

파이썬 자료형별 시간 복잡도 요약

- 리스트: append/pop은 $O(1)$, insert(0,x)/pop(0)은 $O(N)$ - 딕셔너리: 키 탐색 및 삽입은 평균 $O(1)$ - 집합: 원소 추가 add(x), 탐색 모두 $O(1)$ - 탐색이 잦은 알고리즘에는 반드시 set/dict를 사용해야 합니다.

이상한 알고리즘 (CSES 1068, 8000번)

주어진 자연수 $N$에 대해 아래 과정을 반복하여 출력합니다. - $N$이 짝수이면 $N = N // 2$ - $N$이 홀수이면 $N = 3N + 1$ - $N = 1$이 될 때까지 수열을 공백으로 출력

이상한 알고리즘 구현 코드

import sys

def main():
    n = int(sys.stdin.readline())
    result = []
    while True:
        result.append(str(n))
        if n == 1:
            break
        if n % 2 == 0:
            n //= 2
        else:
            n = n * 3 + 1
    sys.stdout.write(" ".join(result) + "\n")

if __name__ == "__main__":
    main()

자주 하는 실수 요약

- rstrip() 누락: 문자열 비교 시 항상 거짓이 반환되는 원인 - 나누기 연산자(/) 오용: 소수점 발생으로 오답 처리 - 리스트 pop(0) 남발: $O(N)$ 누적으로 성능 저하 → deque 활용
ESC — 수업으로 돌아가기  ·  F — 전체화면