문제 요약
N개의 바구니(1~N)가 있고, M번에 걸쳐 구간 [i, j]에 공 번호 k를 “덮어쓰기”로 넣는다.
모든 작업이 끝난 뒤 1번부터 N번 바구니에 들어있는 공 번호를 출력한다. (없으면 0)
핵심은 구간 업데이트를 순서대로 그대로 적용하면 된다는 점이다. (N, M ≤ 100이라 완전탐색으로 충분)
내가 처음 작성한 코드
아래처럼 input()으로 입력 받고, 마지막 출력도 직접 루프를 돌면서 공백 처리까지 해줬다.
n, m = map(int, input().split())
baskets = [0] * n
for i in range(m):
i, j, k = map(int, input().split())
for index in range(i-1, j):
baskets[index] = k
for index in range(n):
if index == n-1:
print(baskets[index], end="")
else:
print(baskets[index], end=" ")
동작은 맞지만,
- 입력이 많아지면
input()은 느릴 수 있고 - 출력에서 공백 처리 로직이 길어져서 코드가 지저분해진다.
개선한 코드: sys.stdin.readline + print(*list)
코딩테스트에서 자주 쓰는 패턴으로 바꿨다.
1) 빠른 입력: sys.stdin.readline
sys는 파이썬 표준 라이브러리이고 항상 사용 가능한 모듈이다.
sys.stdin.readline()은 한 줄 단위로 읽어서, 입력이 많을 때 input()보다 빠른 경우가 많다.
2) 깔끔한 출력: print(*baskets)
리스트를 언패킹해서 print(a, b, c, ...)처럼 출력할 수 있다.
기본 구분자 sep=" "가 적용돼서 “공백으로 구분된 출력”이 간단해진다.
최종 코드 (추천)
import sys
input = sys.stdin.readline
n, m = map(int, input().split())
baskets = [0] * n
for _ in range(m):
i, j, k = map(int, input().split())
for idx in range(i - 1, j):
baskets[idx] = k
print(*baskets)
(선택) 더 파이써닉하게: 슬라이싱으로 구간 덮어쓰기
위 문제는 “구간을 같은 값으로 채우기”라서, 아래처럼도 가능하다.
import sys
input = sys.stdin.readline
n, m = map(int, input().split())
baskets = [0] * n
for _ in range(m):
i, j, k = map(int, input().split())
baskets[i-1:j] = [k] * (j - i + 1)
print(*baskets)
N과 M이 작을 때는 둘 다 충분히 빠르다.
다만 슬라이싱 버전은 “구간을 한 번에 교체한다”는 의도가 더 잘 드러나서 읽기 쉬운 편이다.
이번 문제로 배운 것 정리
- 코딩테스트에서
sys(표준 라이브러리)를 import 해서 빠르게 입력받는 패턴을 익혔다.input = sys.stdin.readline로 바꿔두면 코드가 깔끔해진다.
- 리스트 출력은
print(*baskets)로 공백 구분 출력을 한 줄로 끝낼 수 있다. - 출력 포맷 때문에 불필요하게 루프/조건문이 길어질 때, 파이썬 문법(언패킹, sep 등)으로 단순화할 수 있다.