[Python] 기본 입출력

 

동빈나 채널의 파이썬 문법 부수기 유튜브 강의를 참고하여 정리한 내용이다.

 

코딩테스트는 입력을 받아서 처리하고 출력하는 구조다.

알고리즘이 아무리 완벽해도 입력을 잘못 받거나 출력 형식이 틀리면 오답이 될 수 있다.

그래서 파이썬 입출력에는 생각보다 신경 써야 할 부분이 꽤 있다.

 


 

표준 입력 : 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