경쟁 프로그래밍이란?
경쟁 프로그래밍(Competitive Programming)은 적절한 자료구조를 활용해 효율적인 알고리즘을 작성하는 코딩 활동으로, 다양한 수준에서 프로그래머의 역량을 평가합니다.
참가자는 알고리즘과 자료구조를 기반으로 제시된 가상의 문제를 여러 가지 논리를 적용해 해결해야 합니다. 중요한 것은 단순히 정답을 찾는 것이 아니라, 시간 복잡도와 공간 복잡도 측면에서 효율적인 솔루션을 도출하는 것입니다.
경쟁 프로그래밍에서 출제되는 문제의 예시는 다음과 같습니다.
길이가 n이며 소문자 라틴 알파벳으로만 이루어진 문자열 s가 주어집니다.
문자열의 부분 문자열(substring)은 해당 문자열에서 연속된 일부를 의미합니다. 따라서 "forces"는 "codeforces"의 부분 문자열이지만, "coder"는 그렇지 않습니다.
여러분의 과제는 문자열에서 정확히 하나의 부분 문자열을 제거했을 때 남은 모든 문자가 동일하도록(서로 다른 문자의 개수가 0 또는 1) 만드는 경우의 수를 계산하는 것입니다.
문자열 s에는 최소 두 개의 서로 다른 문자가 있다고 보장됩니다.
문자열 전체를 제거하는 것도 허용되며, 최소 한 글자 이상은 반드시 제거해야 합니다.
위 문제는 어떤 프로그래밍 언어로든 풀 수 있습니다. 그렇다면 왜 많은 개발자가 경쟁 코딩에서 파이썬을 선택할까요?
1. 빠른 구현 속도
파이썬을 선택하는 가장 큰 이유 중 하나는 코드 작성에 소요되는 시간을 획기적으로 줄여주기 때문입니다. 덕분에 참가자는 코드 타이핑보다 문제 해결에 필요한 핵심 로직을 고민하는 데 더 많은 시간을 쓸 수 있습니다.
경쟁 프로그래밍에서는 시간이 곧 승패를 좌우하는 요소입니다. 솔루션을 빠르게 작성할수록 유리하며, 여기서 말하는 '속도'는 파이썬 언어 자체의 실행 속도가 아니라 프로그래머가 코드를 작성하는 속도를 의미합니다.
2. 방대한 표준 라이브러리
파이썬은 매우 광범위한 표준 라이브러리를 기본으로 제공하며, 이는 경쟁 프로그래밍에서 큰 강점으로 작용합니다. 아래는 경쟁 코딩에서 파이썬이 유리한 대표적인 이유들을 정리한 내용입니다.
i. 풍부한 내장 함수
파이썬은 count, min, max, sorted 등 다양한 내장 함수를 제공합니다. 이런 함수들은 지루하고 반복적인 절차를 직접 구현하지 않고도 바로 활용할 수 있게 해주어 매우 편리합니다. 특히 파이썬의 내장 함수는 내부적으로 최적화된 알고리즘을 사용합니다. 예를 들어 sorted() 함수는 Timsort 알고리즘을 채택해 안정적인(stable) 정렬을 보장하며, 최악의 경우에도 O(n log n)의 성능을 냅니다. 또한 최선의 경우 O(1), 즉 상수 시간에 수행될 수 있는 최고 수준의 정렬 알고리즘 중 하나입니다.
#abs()
print(abs(-7))
#max()
print(max(2, 13, 4, 20))
#memoryview()
print(memoryview(bytes(9)))
#object()
o = object();print(type(o))
#pow()
print(pow(2,6))
#reversed
a = reversed([3, 13, 2, 1]); print(a)
#sorted()
print(sorted([9, 2, 4, 13, 7]))
#sum()
print(sum([2, 9, 12, 19]))
#type()
print(type([]))
print(type({}))
#zip()
print(set(zip([1,2],[3,4,5])))
ii. 리스트 컴프리헨션(List Comprehensions)
파이썬은 가장 강력한 리스트 컴프리헨션 문법을 제공합니다. 원래 5~20줄이 필요한 코드를 단 한 줄로 작성할 수 있으며, 중첩 루프와 조건문도 함께 조합해 사용할 수 있습니다.
# 리스트 컴프리헨션으로 문자열 순회하기 l_string = [letter for letter in 'Tutorialspoint'] print(l_string) # 리스트 컴프리헨션 vs 람다 함수 l_lambda = list(map(lambda x: x, 'Tutorialspoint')) print(l_lambda)
실행 결과
['T', 'u', 't', 'o', 'r', 'i', 'a', 'l', 's', 'p', 'o', 'i', 'n', 't'] ['T', 'u', 't', 'o', 'r', 'i', 'a', 'l', 's', 'p', 'o', 'i', 'n', 't']
iii. 표준 라이브러리(가장 큰 강점)
파이썬의 표준 라이브러리는 매우 폭넓은 기능을 제공합니다. 다양한 자료구조가 이미 구현되어 있어 직접 만들 필요가 없으며, 조합 문제 해결에 필수적인 itertools 모듈도 포함되어 있습니다.
예를 들어, 리스트의 모든 가능한 순열(permutation)을 생성해 하나의 리스트에 저장하려면 리스트 컴프리헨션과 itertools의 permutation 함수를 활용하면 됩니다.
파이썬 표준 라이브러리의 주요 분야
| 데이터 타입 | 문자열 | 네트워킹 | 스레드 |
| 운영 체제 | 압축 | GUI | 명령줄 인자 |
| CGI | 복소수 | FTP | 암호학 |
| 테스팅 | 멀티미디어 | 데이터베이스 | CSV 파일 |
| 달력 | 이메일 | XML | 직렬화 |
iv. 다양한 자료구조
파이썬은 딕셔너리, 집합(set), 튜플, 리스트 등 코딩에 즉시 활용할 수 있는 다양한 자료구조를 기본 패키지 형태로 제공합니다.

v. 뛰어난 사용 편의성
파이썬 문법은 사람이 읽기 쉽게 설계되어 있어 코딩이 매우 간단하고 빠릅니다. 실제로 의사코드(pseudocode)를 읽는 듯한 느낌을 줍니다.
>>> print("hello world!")
hello world!
>>> sum([3, 4, 3, 5])
15
>>> max(3, 4, 5, 13, 2)
13
>>> min(3, 4, 5, 13, 2)
2