그리디 알고리즘을 풀다가 너무 막혀서 잠시 그리디 알고리즘을 멈추고, 정렬에 대해 공부를 하고 있다.
오름차순, 내림차순 등은 알겠는데 백준 정렬 알고리즘을 풀다보니
반복문에서 여러개 값을 입력받는데에서 input() 방식을 사용하다 보니 시간초과가 발생하였다.
이러한 문제점들을 검색해보니, 값을 많이 입력받지 않는 경우라면 input()함수를 사용해도 되지만
반복문을 이용해 값을 여러개 입력 받는 경우에는 시간초과가 발생하기 때문에 sys.stdin.readline()함수를 사용해야된다고한다.
< sys.stdin.readline() 함수 사용하기 >
- 한 개의 정수를 입력받을 때
import sys
a = int(sys.stdin.readline())
- 정해진 개수의 정수를 한줄에 입력받을 때
import sys
a, b, c = map(int,sys.stdin.readline().split())
- 임의의 개수의 정수를 한줄에 입력받아 리스트에 저장할때
import sys
data = list(map(int,sys.stdin.readline().split()))
- 임의의 개수의 정수를 n줄 입력받아 2차원 리스트에 저장할때
import sys
n = int(sys.stdin.readline())
data = []
for i in range(n):
data.append(list(map(int,sys.stdin.readline())))
- 문자열 n줄을 입력받아 리스트에 저장할때
import sys
n = int(sys.stdin.readline())
data = [sys.stdin.readline().strip() for i in range(n)]
여기서, strip()는 문자열 맨 앞과 맨 끝의 공백 문자를 제거하는 함수이다.
[ 백준 문제 ]
① 처음에 input() 방식을 사용해서 정렬 알고리즘을 풀었을 때 : 시간초과
n = int(input())
num = []
for i in range(n):
i = int(input())
num.append(i)
num.sort()
for j in num:
print(j)
② sys.stdin.readline() 방식을 사용해서 리스트 입력받았을 때 : 시간초과
import sys
n = int(input())
num = []
for i in range(n):
num.append(sys.stdin.readline())
num.sort()
for j in num:
print(j)
③ 입력을 sys.stdin.readline() , 출력을 sys.stdout.write(), 정렬 방식을 반복문 내에 sorted() 사용했을 때 : 맞았습니다 !!
import sys
n = int(input())
num = []
for i in range(n):
num.append(int(sys.stdin.readline()))
for j in sorted(num):
sys.stdout.write(str(j) + '\n')
백준을 풀다보면 시간 초과랑 메모리 초과를 잘 생각해서 적절한 코드를 짜야겠다는 생각이 든다 ....
입력 : sys.stdin.readline()
출력 : sys.stdout.write()
앞으로 자주 쓰자 ?!!