https://www.acmicpc.net/problem/4358
문제 풀이
import sys
from collections import defaultdict
hash=defaultdict(int)
cnt=0
for line in sys.stdin:
word = line.strip()
if not word:
continue
hash[word] += 1
cnt += 1
trees=sorted(hash.items(),key=lambda x:(x[0],-x[1]))
for k,v in trees:
ratio=v/cnt*100
print(f"{k} {ratio:.4f}")
정리
sys.stdin.readline()
- 한 줄(line)씩 입력을 읽어옴
- 개행 문자(\n)가 포함된 상태로 읽음
- 입력이 여러 줄이면 반복문으로 계속 호출해야 함
import sys
line = sys.stdin.readline()
print(line) # 예: 'apple\n'
sys.stdin.read()
- 전체 입력을 한 번에 문자열로 모두 읽어옴
- EOF(입력 종료)까지 멈추지 않음
- 입력 줄 수가 정해지지 않은 경우에 매우 유용
import sys
data = sys.stdin.read()
print(data) # 여러 줄 입력이 한 번에 들어옴
apple
banana
pear
- readline() → 한 줄씩 읽어서 3번 실행됨
- read() → apple\nbanana\npear\n 한 번에 문자열로 읽힘
줄 수를 아는 입력 (ex. 첫 줄에 N) | sys.stdin.readline() |
줄 수를 모르는 EOF 입력 | sys.stdin.read() + .splitlines() |
strip()
파이썬 문자열에서 양쪽 끝의 불필요한 공백이나 개행 문자(줄바꿈 등)를 제거해주는 함수
text = " Hello, world!\n"
print(text.strip()) # 출력: 'Hello, world!'
strip() | 문자열 양쪽의 공백, 줄바꿈 제거 | ' apple \n'.strip() → 'apple' |
rstrip() | 오른쪽(뒤쪽)만 제거 | 'apple \n'.rstrip() → 'apple' |
lstrip() | 왼쪽(앞쪽)만 제거 | ' apple'.lstrip() → 'apple' |
.strip('특정문자)
s = '---he-llo---'
print(s.strip('-')) # 출력: 'he-llo'
- 중간의 -는 제거되지 않음
- .strip()은 양쪽(왼쪽, 오른쪽) 끝에 있는 문자만 제거
strip() | 양쪽(왼+오른)에서 제거 |
lstrip() | 왼쪽만 제거 |
rstrip() | 오른쪽만 제거 |
s = '(hello)'
print(s.strip('()')) # 출력: 'hello'
s.strip() | 양쪽 공백/개행 제거 | ' a \n'.strip() → 'a' |
s.strip('x') | 양쪽 x 제거 | 'xxabcx'.strip('x') → 'abc' |
s.strip('xyz') | 양쪽에 있는 모든 문자 x, y, z 제거 | 'xyzabcyx'.strip('xyz') → 'abc' |
input()
한 줄 입력
개행문자 제거됨
느림 (내장처리)
input() 과 sys.stdin.readline()의 차이
기본 기능 | 한 줄 입력 | 한 줄 입력 |
리턴값 | 개행문자 제거됨 | 개행문자 포함됨 (\n) |
속도 | 느림 (내장처리) | 빠름 (백준에서는 주로 사용) |
splitlines()
- 문자열을 \n, \r\n, \r 등 줄바꿈 기준으로 나눠서 리스트로 반환
- 줄바꿈 문자는 제거됨 (strip()처럼 따로 안 써도 됨)
text = "apple\nbanana\npear"
lines = text.splitlines()
print(lines)
['apple', 'banana', 'pear']
실전에서 자주 쓰는 형태
백준 문제처럼 입력 줄 수가 정해지지 않고 EOF까지 쭉 받는 경우
import sys
lines = sys.stdin.read().splitlines()
- sys.stdin.read() → 입력 전체를 한 문자열로 받음
- .splitlines() → 줄바꿈 기준으로 쪼개서 리스트로 만듦
sys.stdin
표준 입력
✅ 주요 메서드 비교
sys.stdin.read() | 전체 입력을 한 번에 읽음 (EOF까지) | 백준 4358 같이 EOF 입력 문제 |
sys.stdin.readline() | 한 줄씩 입력 | 입력 줄 수 정해진 문제 |
sys.stdin.readlines() | 모든 줄을 리스트로 반환 | 리스트로 다루고 싶을 때 |
input().split()
input()은 개행문자를 받아들이나? X
input()은 개행문자(\n)를 자동으로 제거한 상태로 문자열을 반환
s = input() # 입력: apple + Enter
print(repr(s)) # 출력: 'apple'
- 사용자가 엔터를 쳐도, input()은 줄바꿈(\n)을 포함하지 않음
- 즉, input()은 내부적으로 .rstrip('\n')된 값을 반환한다고 생각
input().split()도 개행문자를 받아들이나? X
마찬가지로 개행문자는 이미 사라진 상태에서 split이 동작
s = input().split() # 입력: hello world + Enter
print(s) # 출력: ['hello', 'world']
- input()이 개행문자를 없앤 문자열을 반환하고,
- split()은 그 문자열을 공백 기준으로 나눠 리스트로 반환
'코딩테스트 > 백준' 카테고리의 다른 글
[백준] #11279 최대 힙 (python) (0) | 2025.05.10 |
---|---|
[백준] #20055 컨베이어 벨트 위의 로봇 (python) (0) | 2025.05.08 |
[백준] #24444 알고리즘 수업 - 너비 우선 탐색 1 (python) (0) | 2025.05.08 |
[백준] #14940 쉬운 최단거리 (python) (0) | 2025.05.07 |
[백준] #2468 안전 영역 (python) (0) | 2025.05.04 |