티스토리 뷰
반응형
풀이
import sys
input= sys.stdin.readline
t = input()
a = list(map(int,input().rstrip().split()))
print(min(a),max(a))
가장 간단하게 생각하면 그냥 min, max 함수를 쓰면 된다.
그런데 이렇게 한다면 정말 기적적으로 연산속도가 느려지는 걸 볼 수 있다. 왜일까?
이는 파이썬이 인터프리터 언어기 때문에 min과 max를 계산할 때 전부 대조해서 계산하기 때문이다.
최대 1,000,000개의 연산을 하게 때문에, 통상 시간복잡도 계산 상 테스트 케이스가 10만을 넘어가는 순간 속도가 저하된다.(10만이라는 숫자는 for for 함수의 최대치이기도 하다)
그렇다면 어떻게 하면 조금이라도 연산속도를 줄일 수 있을까? 답은 의외로 간단한데, 지정을 안해주고 다이렉트로 넣으면 된다.
from sys import stdin
_, *a = map(int, stdin.buffer.read().split())
print(min(a), max(a))
사실상 숫자의 개수는 필요 없으므로 _ 연산자로 날려버리고, *과 buffer 메소드를 사용한다.
Asterisk(*)는 여러 방면으로 사용할 수 있는데, 여기서는 가변 인자로서 buffer을 사용하기 위해 쓴다.
buffer 메소드는 read()와 대조된다. 일반적인 read()는 버퍼가 존재하지 않고 특정 길이의 데이터를 전부 출력하지만, buffer을 사용하게 되면 전부 공백과 줄바꿈 단위로 쪼개서 리스트로 만든다.
이를 언패킹이라고 한다. 편의상 존재하는 기능으로서 몇개의 인자를 받던지 상관하지 않고 출력하기 위해 존재한다.
이를 잘 알아둔다면 훨씬 편리하게 코드를 짤 수 있을 것이다.
a, b, c = map(int,input().split()) #한 줄 입력을 공백 단위로 쪼개서 a b c에 하나씩 넣습니다.
n, *arr = map(int,input().split()) #한 줄 입력을 공백 단위로 쪼개서 첫번째는 n에, 나머지는 arr에 넣어 리스트로 만듭니다.
_, *arr = map(int, sys.stdin.buffer.read().split())
#여러 줄 입력을 공백과 줄바꿈 단위로 쪼개서 첫번째는 _(변수)에, 나머지는 arr에 넣어 리스트로 만듭니다.
반응형