동빈나 채널의 파이썬 문법 부수기 유튜브 강의를 참고하여 정리한 내용이다.
코딩테스트는 입력을 받아서 처리하고 출력하는 구조다.
알고리즘이 아무리 완벽해도 입력을 잘못 받거나 출력 형식이 틀리면 오답이 될 수 있다.
그래서 파이썬 입출력에는 생각보다 신경 써야 할 부분이 꽤 있다.
표준 입력 : input()
기본 사용
name = input() # 한 줄 입력받기
age = input("나이: ") # 프롬프트 출력 후 입력받기
print(name) # 입력한 값 그대로 출력
print(type(name)) # <class 'str'> - 항상 문자열로 받아온다
input()은 항상 문자열을 반환한다. 숫자가 필요하면 형변환이 필수다.
n = int(input()) # 정수
x = float(input()) # 실수
map()과 split()으로 여러 값 받기
코딩테스트에서 가장 자주 쓰는 패턴이다. 한 줄에 여러 숫자가 공백으로 구분되어 주어지는 경우가 대부분이다.
# "1 2 3" 형태의 입력
a, b, c = map(int, input().split())
print(a, b, c) # 1 2 3
# 개수가 정해지지 않은 경우 - 리스트로 받기
nums = list(map(int, input().split()))
print(nums) # [1, 2, 3, 4, 5]
split()은 기본적으로 공백(스페이스, 탭, 개행 모두)으로 나눈다.
구분자가 다르면 인수로 지정한다.
# "1,2,3" 형태 (콤마 구분)
a, b, c = map(int, input().split(","))
ValueError - 개수 불일치
# "1 2" 만 입력했는데 세 변수에 받으려 할 때
a, b, c = map(int, input().split())
# ValueError: not enough values to unpack (expected 3, got 2)
# 반대로 "1 2 3 4" 입력했는데 두 변수에만 받으려 할 때
a, b = map(int, input().split())
# ValueError: too many values to unpack (expected 2)
값의 개수가 맞지 않으면 ValueError가 난다. 입력 개수를 꼭 확인해야 한다.
빠른 입력 : sys.stdin.readline()
input()은 편하지만 느리다. 입력 데이터가 많을 때(보통 10만 줄 이상) 시간 초과가 나는 경우가 있다. 이럴 때 sys.stdin.readline()을 쓴다.
import sys
input = sys.stdin.readline # 이렇게 덮어씌우면 기존 코드 그대로 쓸 수 있다
n = int(input())
a, b = map(int, input().split())
sys.stdin.readline()을 input에 할당하는 패턴을 많이 쓴다.
코드 상단에 한 줄만 추가하면 나머지는 바꿀 필요가 없다.
rstrip() 주의
sys.stdin.readline()은 줄 끝의 개행 문자(\n)를 포함해서 읽어온다.
문자열 그대로 쓸 때는 제거해야 한다.
import sys
line = sys.stdin.readline()
print(repr(line)) # 'hello\n' <- \n 포함
line = sys.stdin.readline().rstrip()
print(repr(line)) # 'hello' <- 제거됨
int()나 split()을 바로 쓸 때는 자동으로 처리되니 신경 안 써도 된다.
문자열 그대로 쓸 때만 rstrip()을 붙인다.
성능 비교
import sys
import time
# input() 방식 - 100만 줄
# 약 3~5초
# sys.stdin.readline() 방식 - 100만 줄
# 약 0.5초
입력이 많은 문제에서는 체감상 꽤 차이 난다.
다양한 입력 패턴
여러 줄 입력
import sys
input = sys.stdin.readline
n = int(input())
for _ in range(n):
a, b = map(int, input().split())
print(a + b)
2차원 배열 입력
n, m = map(int, input().split())
grid = [list(map(int, input().split())) for _ in range(n)]
# 입력 예:
# 3 4
# 1 2 3 4
# 5 6 7 8
# 9 0 1 2
print(grid)
# [[1, 2, 3, 4], [5, 6, 7, 8], [9, 0, 1, 2]]
입력 줄 수가 정해지지 않은 경우
import sys
data = sys.stdin.read().split() # 전체를 한 번에 읽고 분리
# 이후 data[0], data[1]... 순서대로 접근
입력 줄 수가 불분명할 때는 전체를 한 번에 읽어버리는 방법도 있다.
표준 출력 : print()
기본 사용
print("hello") # hello
print(1, 2, 3) # 1 2 3 (기본 구분자 공백)
print(1 + 2) # 3
print("값:", 42) # 값: 42
sep와 end 속성
# sep: 여러 인수 사이의 구분자 (기본: 공백)
print(1, 2, 3, sep=",") # 1,2,3
print(1, 2, 3, sep="\n") # 줄바꿈으로 구분
# 1
# 2
# 3
# end: 출력 끝에 붙는 문자 (기본: \n)
print("hello", end=" ")
print("world") # hello world (한 줄에 출력됨)
print("hello", end="")
print("world") # helloworld
print(*리스트) 패턴
리스트 원소를 한 줄에 공백으로 출력할 때 자주 쓰는 패턴이다.
nums = [1, 2, 3, 4, 5]
# 이렇게 하면 리스트 자체가 출력됨
print(nums) # [1, 2, 3, 4, 5]
# *로 언패킹하면 원소가 공백으로 구분되어 출력됨
print(*nums) # 1 2 3 4 5
# sep 조합
print(*nums, sep=",") # 1,2,3,4,5
print(*nums, sep="\n")
# 1
# 2
# 3
# 4
# 5
문자열 포매팅
f-string (권장)
Python 3.6 이상에서 사용 가능하다. 가독성이 가장 좋고 성능도 빠르다.
name = "Alice"
score = 95.5
print(f"이름: {name}, 점수: {score}")
# 이름: Alice, 점수: 95.5
# 표현식도 들어갈 수 있다
print(f"점수 두 배: {score * 2}")
# 점수 두 배: 191.0
# 소수점 자리수 지정
print(f"{score:.2f}") # 95.50
print(f"{score:.0f}") # 96 (반올림)
# 자리수 맞추기 (우측 정렬, 10칸)
print(f"{score:10.2f}") # 95.50
print(f"{name:<10}") # Alice (좌측 정렬, 10칸)
print(f"{name:^10}") # Alice (중앙 정렬, 10칸)
format()과 % 비교
name = "Bob"
score = 88
# % 포매팅 (구식)
print("이름: %s, 점수: %d" % (name, score)) # 이름: Bob, 점수: 88
# format() 메서드
print("이름: {}, 점수: {}".format(name, score)) # 이름: Bob, 점수: 88
print("이름: {0}, 점수: {1}".format(name, score)) # 인덱스 지정
print("이름: {n}, 점수: {s}".format(n=name, s=score)) # 키워드 지정
# f-string (권장)
print(f"이름: {name}, 점수: {score}")
| 방식 | 버전 | 권장 |
|---|---|---|
% 포매팅 |
구식 | 비권장 |
.format() |
Python 2.6+ | 보통 |
| f-string | Python 3.6+ | 권장 |
코딩테스트 환경은 보통 Python 3.6 이상이므로 f-string을 쓰면 된다.
입력 관련 에러 상황
EOFError
입력이 더 이상 없는데 input()을 호출할 때 발생한다.
while True:
line = input() # 입력이 끝나면 EOFError 발생
print(line)
# EOFError를 처리해야 하는 경우
import sys
for line in sys.stdin:
line = line.rstrip()
print(line)
# 이 방식은 EOF를 자연스럽게 처리함
ValueError
n = int(input()) # 정수가 아닌 값 입력 시
# ValueError: invalid literal for int() with base 10: 'abc'
a, b = map(int, input().split()) # "1 2 3" 처럼 개수 불일치
# ValueError: too many values to unpack (expected 2)
공백 처리 실수
# sys.stdin.readline() 사용 시 개행 문자 포함 주의
import sys
s = sys.stdin.readline()
if s == "YES": # 틀림 - s는 "YES\n"
print("맞음")
if s.rstrip() == "YES": # 올바름
print("맞음")
실전 입력 템플릿
코딩테스트에서 자주 쓰는 입력 패턴들을 정리해두면 편하다.
import sys
input = sys.stdin.readline
# 정수 하나
n = int(input())
# 공백으로 구분된 정수 여러 개 (변수에)
a, b, c = map(int, input().split())
# 공백으로 구분된 정수 여러 개 (리스트에)
nums = list(map(int, input().split()))
# n줄에 걸쳐 정수 리스트
n = int(input())
data = [list(map(int, input().split())) for _ in range(n)]
# 문자열 입력 (개행 제거)
s = input().rstrip()
'Study > Python' 카테고리의 다른 글
| [Python] 알고리즘 설계 기초 (0) | 2026.03.07 |
|---|---|
| [Python] 표준 라이브러리 (0) | 2026.03.07 |
| [Python] 함수(Function)와 람다 표현식(Lambda) (0) | 2026.03.07 |
| [Python] 반복문 (0) | 2026.03.07 |
| [Python] 조건문 (0) | 2026.03.07 |
