본문 바로가기

파이썬 python

파이썬 시간초과 - 입력받기, 시간 줄이기 [input(), sys.stdin.readline()]

백준 실버문제를 풀기 시작하면서 난관에 봉착했던 기억이 있따. 당시 당황했던 경험을 하지 않길 바라며

겨우 입력을 받는 것부터 막혀서 시간을 허비하는 것,
게다가 입력문제인지 깨닫는데도 많은 시간이 걸렸다.

추가적으로 입력받는 방법들을 조금 정리하려 한다.


코딩테스트, 문제를 풀게되면 입력을 받아 내용을 처리하는데
가끔 이 입력되는 값이 여러줄로 들어오는 일이 있다.

여기서 자연스럽게 input() 함수를 사용한다면 영문도 모르게 시간초과를 경험하게 될 것

input()함수는 파라미터를 prompt에 띄우는 역할을 하기 때문
아무 인자를 넘겨주지 않는경우도 input은 입력을 받는 것 외에도 추가적인 부하를 가지게 된다.

sys.stdin.readline

파이썬내장 라이브러리중 sys라는 모듈이 있다.
stdin은 표준 입력
readline은 줄별로 읽어오겠다는 의미인듯

사용법은 input()과 거의 같다. 

import sys
A = sys.stdin.readline()

사용이 어색하다면 다음과 같은 방법을 이용할 수도 있다.

import sys
input = sys.stdin.readline

A = input()

단, input()과 달리 개행문자 \n이 포함된 변수를 입력받게 될 것이다.
strip() rstrip()등의 함수로 제거할 수 있다.

입력 행이 많은 경우에는 위 방법 만으로도 시간이 상당 줄어드는 것을 볼 수 있을 것이다.


 

1. 정수 입력받기

import sys; input=sys.stdin.readline
N = int(input())

 

2. 구분자, 공백으로 구분된 문자열 입력받기

import sys; input=sys.stdin.readline

# input <<< '1 2 3'
a, b, c = map(int, input().split())

>>>a = 1
>>>b = 2
>>>c = 3

arr = list(map(int, input().split()))

>>> arr = [1, 2, 3]

# *을 붙여 들어오는 갯수에 관계없이 list에 저장할 수 있다.
a, *arr = map(int, input().split())

>>> a = 1
>>> b = [2, 3]

 

3. 공백없이 붙어있는 문자열 나누기

import sys; input=sys.stdin.readline

# input <<< '12345'
A = list(input().strip())

>>> A = ['1', '2', '3', '4', '5']

# 이후 map 함수 활용해서 정수형으로 변환할 수 있다.

 

4. 1차원 배열 입력받기

import sys; input=sys.stdin.readline
'''
 input <<< '1
             2
             3'
'''
G = [ int(input()) for _ in range(3)]
>>> G = [1, 2, 3]

리스트 안에서도 for문을 이용할 수 있다.
리스트 컴프리헨션이라고 부르는 기능인데 for문으로 append 해주는 것 보다 메모리와 시간을 절약할 수 있다.

 

5. 2차원 배열 입력받기

import sys; input=sys.stdin.readline

'''
input <<<
    '2 2' # N, M
    '1 2'
    '3 4'
'''
N, M = map(int, input())
G = [list(map(int,input().split())) for _ in range(N)]

>>> G = [[1, 2],
         [3, 4]]

 

6. 특이한 입력 처리하기 # lambda x

import sys; input=sys.stdin.readline

# A = list(map(lambda 입력: 출력, input().split()))

'''
input <<<
    I O I O
    O O I I
'''

A = [list(map(lambda x: 1 if x=='I' else 0, input().split())) for _ in range(2)]

>>> A = [[1, 0, 1, 0],
         [0, 0, 1, 1]]

 

그냥 입력받고 for문으로 처리할 수도 있지만
한 줄로 처리하면 고수가 된 기분을 낼 수 있다. 기분만


open(0).readline() 등 함수를 사용하면 내장함수 만으로도 해결할 수 있다.

open(0) == sys.stdin처럼 사용할 수 있다.

A = open(0).readline().strip()

 

open, lambda x, A if bool else B 등에 대해서는 따로 설명하는 글을 작성해 보려한다.

반응형

'파이썬 python' 카테고리의 다른 글

파이썬 변수 if else로 만들기/ 한 줄 if else  (0) 2023.06.27