Python | 데이터 입력

전지웅·2022년 3월 1일
0

백준 문제를 풀다 보면 여러가지의 데이터 입력방법을 알아야 한다. 그래서 한 눈에 알아보기 쉽게 정리해 보았다.

🔎 input을 활용한 방법


📌 1개의 데이터 입력받는 법

a = int(input())

👉 input()에 입력되는 데이터를 모두 문자열로 입력받는다. int()로 감싸주어 변환시켜주고 float(), str()도 사용 가능하다.

📌 2개 이상의 데이터를 입력받는 법

a,b = map(int, input().split())
# 2 3

👉 위의 주석처럼 수들을 공백을 사용해서 입력받는 문제가 많을 것이다. 그럴 때 map()split()사용해서 a와 b를 입력받으면 된다. 3개 이상일 경우 a,b,c, =처럼 변수만 늘려주면 된다. int대신 floatstr로도 가능하다.

📌 리스트 형태로 입력받는 법

a = list(map(int, input().split()))
# 2 5 3 2 6 -> [2, 5, 3, 2, 6]

👉 list()를 쓰게 되면 주석의 형태처럼 입력받은 수를 리스트로 변환 시켜준다.

📌 처음 입력받은 수만큼 리스트 요소를 입력받는 법

a = [int(input()) for _ in range(int(input()))]
# 3
# 1
# 2
# 3 -> [1, 2, 3]

👉 처음 입력받은 3만큼 반복해 input()을 받아 리스트를 만들어 준다. 이거는 문제마다 다르게 써야 한다. 처음 입력받은 3이 나중에 다른 곳에 쓸 때가 있다면 따로 변수로 입력을 받아 반복문에 넣어야 한다.

📌 변수와 리스트를 동시에 입력받는 법

a, a_list = int(input()),list(map(int, input().split()))
# 10
# 1 2 3 4 -> 10 [1, 2, 3, 4]

👉 처음에는 변수를 받고 다음 줄에는 리스트형으로 입력을 받을 수 있다. 위에서처럼 마찬가지로 추가로 입력을 받고 싶다면 변수를 추가로 지정해 주고, 어떻게 입력을 받을지 추가를 해주면 된다.

🔎 중복을 제거하고 정렬하는 법

a = sorted(set(list(map(int, input().split()))))
# 8 2 8 2 9 9 1 4 5 -> [1, 2, 4, 5, 8, 9]

👉 set()은 입력받은 리스트 중에 중복이 있으면 중복을 제거해 주고 하나만 남겨준다. sorted()는 리스트를 정렬하여 반환시켜준다. sorted()는 원래 리스트에 영향을 주지 않고 결괏값을 반환시키고, sort()는 원래 리스트에 영향을 주어 리스트 내 목록들이 바뀐다.

💡위의 방법으로 대부분의 문제에서 입력을 받을 수 있다. 하지만 입력하고자 하는 수가 많은 경우에는 input()을 사용하여 풀다 보면 시간 초과로 못 푸는 경우가 있다.

🔎 sys모듈을 사용하여 입력받는 법


📌 1개만 입력을 받을 때

import sys
a = int(sys.stdin.readline().strip())

👉 sys.stdin.readline()은 한줄로 입력을 받는데, 동시에 개행문자까지 입력을 받는다. strip()을 사용해서 개행문자를 제거해줍니다.

📌 2개 이상 입력을 받을 때

import sys
a,b,c = map(int,sys.stdin.readline().split())

👉 sys.stdin.readline()을 이용하여 한줄로 입력을 받고, split()으로 공백을 기준으로 a, b, c에 값을 대입한다.

📌 리스트 형태로 입력받는 법

import sys
a = list(map(int,sys.stdin.readline().split()))

👉 input().split()대신에 sys.stdin.readline().split()을 사용했다고 생각하면 된다.

+ 리스트 형태로 입력받는 법

import sys
input = sys.stdin.readline
a = list(map(int,input().split()))

👉 inputsys.stdin.readline 대입하여 사용하였다.

+ 한줄씩 입력을 받을때

import sys
input = sys.stdin.read
data = input().splitlines()
# data[0] = 1
# data[1] = 2
.
.
.

이렇게 한 줄씩 입력이 주어질때 한번에 받아서 리스트 형태로 넣어준다.

🔎 속도차이(백준 1181번)


👉 처음에 input()을 사용해서 이 문제를 풀다보니 성공은 했지만 시간이 840m/s가 나왔다. 👉 sys모듈을 사용법을 배우고 나서 sys.stdin.readline()을 사용하니 거의 1/10로 시간이 줄어들었다. 입력에서 시간이 단축할 수 있구나를 알게 되었다.

문제에 알맞게 input()을 사용할지 sys.stdin.readline()을 사용할지 결정해서 사용하면 될것 같다.

profile
경북대학교 컴퓨터학부 글로벌SW융합 전공

0개의 댓글