팩토리얼
import sys
def factorial(n):
ans = 1
for i in range(2, n + 1):
ans *= i
return ans
반올림(decimal)
from decimal import Decimal, ROUND_HALF_UP
def traditional_round(number):
return int(Decimal(str(number)).quantize(Decimal('1'), rounding=ROUND_HALF_UP))
print(traditional_round(2.5))
print(traditional_round(3.5))
최빈값
from collections import Counter
def get_mode_with_counter(arr):
arr.sort()
counter = Counter(arr)
modes = counter.most_common()
if len(modes) > 1 and modes[0][1] == modes[1][1]:
return modes[1][0]
else:
return modes[0][0]
입력
- 아래는 둘 다 빠른 입력을 위해 사용되지만
- 데이터를 읽어오는 방식과 범위에서 명확한 차이가 존재
- 두 가지의 특징과 예시를 명확하게 비교해보기
sys.stdin.readline()
한 줄씩 순차적으로 읽기
- 이 함수는 호출될 때마다 입력 스트림에서 딱 한 줄만 읽어옴
- 특징
- 엔터(개행 문자, \n)를 만날 때까지의 문자열을 읽어오며, 결과값에 \n이 포함됨
- 사용하기 좋은 상황
- 각 줄의 데이터가 독립적인 의미를 가지거나, 줄 단위로 순차적인 처리가 필요할 때 주로 사용
.split()을 붙였을 때와 안 붙였을 때
10 20 30
"10 20 30\n" (끝에 엔터값이 붙은 하나의 문자열)
['10', '20', '30'] (문자열들이 담긴 리스트)
[10, 20, 30] (정수들이 담긴 리스트)
3
10 20
30 40
[[10, 20], [30, 40]] (정수 리스트를 원소로 가지는 2차원 리스트)
import sys
n = int(sys.stdin.readline())
data = [list(map(int, sys.stdin.readline().split())) for _ in range(n)]
print(data)
import sys
input_data = sys.stdin.read().split()
if input_data:
n = int(input_data[0])
data = []
for i in range(1, len(input_data), 2):
data.append([int(input_data[i]), int(input_data[i+1])])
print(data)
sys.stdin.read()
전체를 한 번에 통째로 읽기
- 이 함수는 파일의 끝(EOF)에 도달할 때까지
- 모든 입력 데이터를 한 번에 읽어와서 하나의 거대한 문자열로 반환
- 특징
- I/O(입출력) 호출을 단 한 번만 하므로, 파이썬에서 가장 빠른 입력 방법임
- 사용하기 좋은 상황
- 줄바꿈이나 공백에 큰 의미를 두지 않고
- 전체 데이터를 한꺼번에 리스트 등으로 변환해서 처리하고 싶을 때 매우 강력
.split()을 붙였을 때와 안 붙였을 때
3
10 20
30 40
"3\n10 20\n30 40\n" (타입: 문자열)
['3', '10', '20', '30', '40'] (타입: 리스트)
비교
입력은 같지만, 내가 코드를 짜기 편한 형태로 데이터를 잘라(파싱해) 두는 방식이 다르다"
예시
# 입력
3
10 20
30 40
# sys.stdin.read().split()으로 받았을 때 저장되는 형태
['3', '10', '20', '30', '40'] (1차원 리스트 하나에 모두 저장)
# sys.stdin.readline()을 3번 호출해서 받았을 때 저장되는 형태
첫 번째 변수 = '3\n'
두 번째 변수 = '10 20\n'
세 번째 변수 = '30 40\n'
비교 2
sys.stdin.read().split() / sys.stdin.readline().split()
# 입력
3
10
20
30
40
50
# readline().split()
딱 첫 줄인 ['3']만 가져옴, 다 가져오려면 for문을 돌리면서 여러 번 호출해야 함
# read().split()
줄바꿈을 다 무시하고 ['3', '10', '20', '30', '40', '50'] 이라는 하나의 리스트로 깔끔하게 다 가져옴