파이썬 여러개 입력받기 - paisseon yeoleogae iblyeogbadgi

아래 몇 가지 함수를 이용하면 한 줄로 입력받은 각각의 값을 변수에 저장할 수 있다.

먼저 필요한 함수를 먼저 살펴본다.

input()

사용자가 입력한 값을 문자열로 취급하여 변수에 저장할 수 있다.

코드

a = input()

# 프롬프트에 메세지 출력
b = input("enter text: ")

split()

매개변수로 전달받은 문자열을 기준으로 문자열을 나누어 리스트로 반환한다.

전달받은 문자 값이 없는 경우 스페이스, 탭, 엔터 등의 공백을 기준으로 문자열을 나눈다.

map(function, interable)

내장 함수로 입력받은 반복 가능한 자료형에 대해 입력받은 함수를 수행하여 반환한다.

보통 여러 개의 데이터를 한 번에 다른 형태로 변환하기 위해 사용한다.

map 객체를 반환하기 때문에 객체 내 저장된 값을 출력하기 위해서는 list, tuple 등으로 형변환해야 한다.


즉, 한 줄로 입력 받은 문자열을 공백을 기준으로 나눈 후 적절히 형변환하여 저장하면 된다.

이 동작을 코드로 표현하면 아래와 같다. 

# 정수를 입력받는 경우
a, b = map(int, input().split())

입력한 값의 개수가 달라지면 에러가 발생한다. 입력한 값의 개수를 모른다면 map의 결과를 리스트로 변환하여 저장하는 것도 방법이다.

문자열을 그대로 사용하는 경우 형변환은 하지 않아도 될 것 같다.

정수 여러개 동시에 입력받기

파이썬에서 그냥 변수를 여러개 입력받는 것은 쉽습니다.

a, b, c, d = input().split()

이런 식으로 split()을 이용하여 여러 개 입력받을 수도 있습니다.

하지만 파이썬에서는 기본적으로 input()을 사용하면 문자열 형식으로 입력받기 때문에

정수를 입력받고 싶을 때는

a = int(input())

이런 형식을 사용합니다.

하지만, 문제는 여러개의 정수를 입력받고 싶을 때 int를 사용하면,

split()은 기본적으로 리스트로 나누어 주기 때문에 형변환이 이루어지지 않아 컴파일 에러가 납니다.

a ,b = int(input().split())
# TypeError 발생

이럴 때 사용하는 것이 map() 입니다.

a, b = map(int, input().split())

이러면 map의 첫번째 파라미터로 넣은 형식에 따라 형변환을 전체 다 해줍니다.

이런 식으로 여러 개의 정수를 동시에 입력받을 수 있습니다.

오늘의 포스팅은 파이썬에서 데이터 입력받기. 백준문제를 풀다가 시작하자 마자 막혔다ㅋㅋㅋ휴 나의 수준이란..

파이썬에서 데이터를 입력받기 위해서는 기본적으로 input()함수를 이용한다. 

a = input()
print(a)

위 코드를 실행하고 터미널에 어떤 데이터(문자 or 숫자 등)을 입력하면 입력한 그대로 출력하는걸 확인 할 수 있다. 예를들어 10을 입력하면 10이 그대로 출력되고, Hello 를 입력해도 그대로 Hello가 출력된다. 입력한 값이 숫자던 문자던 상관없이 input()함수를 이용해 데이터를 입력받으면 모두 문자열로 반환한다. type()함수를 이용해 확인해자.

a = input()
print(type(a))

위 코드에서 어떤 값을 입력하면 변수 a 의 타입을 알려준다. <class 'str'> 변수 a는 문자열이란 뜻이다. 

입력받은 데이터를 문자형이 아닌 다른 형으로 변환하려면 형변환을 해줘야한다. 예를 들어 정수형으로 변환하고 싶으면 int()함수를 이용한다. 

a = int(intput())
print(a)
print(type(a))

10을 입력하면 10이 출력되고 데이터 타입은 int형으로 출력될거다. 여기에 문자를 입력하면??? 당연히 에러가 발생한다. 입력받은 문자를 int형으로 변환할 수 없기때문이다. 

이번에는 input()함수를 이용해 여러개의 데이터를 입력받는 방법을 알아보자!

a, b = input().split()
print(a, b)
print(type(a), type(b))

split()함수는 공백을 기준으로 데이터를 분리한다. Hello Python을 입력하면 a에는 Hello, b에는 Python이 저장된다. 

데이터 타입은 모두 str이다. 

그럼 두개의 숫자데이터를 입력받으려면 ????

map()함수를 조합해 사용하면된다.

a, b = map(int, input().split())
print(a, b)
print(type(a), type(b))

10 20 을 입력하면 10과 20이 그대로 출력되고 데이터 타입이 int형인걸 확인할 수 있다. map의 첫번쨰 전달인자를 원하는 데이터 타입으로 변경하면 입력받는 데이터 타입을 변경할 수 있다. 여기서도 위와 같이 문자를 입력하면 에러가 발생한다. 

map에 대해서는 ..다음 포스팅에서 

- 끝 -

파이썬 여러개 입력받기 - paisseon yeoleogae iblyeogbadgi
Python Logo

* 전체 코드

### 정수 1개 입력받기
N = int(input())

### 한줄 정수 리스트 입력받기
li = [*map(int,input().split())]

### 여러개 정수 입력받기
a,b,c = map(int,input().split())

### 여러 줄의 정수 리스트 입력받기
n = int(input())
li = [int(input()) for _ in range(n)]
## n 없이 한 줄로
li = [int(input()) for _ in range(int(input()))]

### N행 배열 입력받기
#### 숫자인 경우
N=int(input()) # N개의 행
arr=[[*map(int,input().split())] for _ in range(N)]

#### 문자열인 경우
N=int(input()) # N개의 행
arr=[list(input()) for _ in range(N)]

## 입력 빠르게하기
import sys
input=sys.stdin.readline # input함수 바꾸기


1. 배경

백준에서 알고리즘 문제를 풀다 보면, 다양한 입력 상황을 마주하게 됩니다. Python으로 알고리즘 문제를 풀 때, 이런 입력 상황을 깔끔하고 간결한 코드로 해결하는 방법을 알아보겠습니다.

2. 정수 입력받기

1) 정수 1개 입력받기

N = int(input())

* 코드 설명

파이썬에서 input() 함수의 역할은 사용자로부터 표준 입력(키보드를 입력받는 것)을 받는 것입니다. 사용자로부터 입력받은 것을 문자열로 반환하기 때문에, 정수를 입력받으려면 int() 함수를 사용해서 정수로 바꿔줘야 합니다. 아래 사진은 10을 입력받고, 출력한 예시입니다. input() 함수를 실행하고, 10을 치고 엔터를 누르면 됩니다. 그러면 input() 함수는 "10"(문자열)을 반환하고 int()에 의해 10(정수형)으로 바뀌어 N에 들어갑니다.

* 예시 출력

파이썬 여러개 입력받기 - paisseon yeoleogae iblyeogbadgi
1개 정수 입력받기

2) 한 줄의 여러 정수 입력받기 - 리스트로

li = [*map(int,input().split())]

* 코드 설명

input().split()은 사용자로부터 받은 입력을 공백을 구분자로 나누어 리스트로 바꾸는 기능입니다. 여기에 map함수를 통해, 각 원소를 int형으로 바꿔주게 됩니다. 즉, input().split()이 반환하는 건 리스트이고, map(int, 리스트)를 통해 리스트의 각 원소를 정수로 바꿔주는 것입니다. 앞에 *(에스터리크)unpacking기능으로, [*map객체]를 하면 map객체가 unpacking 되고, []에 의해 리스트화 됩니다. 즉, map에 의해 각 원소가 정수로 바뀐 것을 다시 리스트로 바꿔주는 것입니다. "1 2 3 4 5"를 입력한 뒤, 위 코드를 실행한 결과를 보겠습니다.

(map 함수 개념: [Python] map 함수란? 활용법(lambda))

(input().split() 설명: [Python] 문자열 자르기 (str to list) [split함수])

* 예시 출력

파이썬 여러개 입력받기 - paisseon yeoleogae iblyeogbadgi
한 줄 정수 리스트 입력받기

3) 한 줄의 여러 정수 입력받기 - 여러 변수로

a,b,c = map(int,input().split())

* 코드 설명

위 코드에서 [* ] 부분을 제외한 것입니다. input().split()으로 나눠진 리스트 원소 개수와 똑같이 변수 개수를 써줘야 합니다. 즉, 위 코드를 실행했을 때, 원소가 3개가 되게 입력해야, 그것이 차례로 a, b, c에 들어갑니다. map() 함수 실행 결과는 위처럼 여러 변수에 바로 할당할 수 있다는 장점이 있습니다. 위 코드를 실행하고 "1 2 3"을 입력한 뒤, 출력해보겠습니다. (변수, 변수, 변수 이런 식으로 사용하면 아래처럼 자동으로 튜플 형태로 반환됩니다.)

* 예시 출력

파이썬 여러개 입력받기 - paisseon yeoleogae iblyeogbadgi
여러 정수, 여러 변수로 입력받기

4) 여러 줄의 정수 입력받기

n = int(input()) # 입력 받을 정수 개수
li = [int(input()) for _ in range(n)]

* 코드 설명

처음에 n에 입력받을 정수 개수를 사용자로부터 입력받습니다. 그리고 리스트컴프리헨션을 이용해 n번 반복하면서 n개 줄의 정수를 입력받아 li에 리스트로 할당합니다. n에 3을 입력하고, 1 2 3을 차례로 입력한 뒤, 출력해보겠습니다.

* 예시 출력

파이썬 여러개 입력받기 - paisseon yeoleogae iblyeogbadgi
여러 줄의 정수 입력받기

백준에서 알고리즘 문제를 풀다 보면, n을 따로 사용하지 않는 경우가 많습니다. 위 코드를 n을 따로 입력받지 않고, 바로 3을 입력받아, 3번 반복하여 1, 2, 3을 입력받도록 한 줄로 코드를 작성해보겠습니다.

li = [int(input()) for _ in range(int(input()))]

* 코드 설명

range() 안의 int(input())이 먼저 실행됩니다. 3을 입력하게 되면 3번 반복하며 리스트컴프리헨션에서 왼쪽의 int(input())이 3번 실행됩니다. 결과 li 변수에 [1, 2, 3]이 할당됩니다.

3. 배열 입력받기

1) 숫자 배열 입력받기

N=int(input()) # N개의 행
arr=[[*map(int,input().split())] for _ in range(N)]

* 코드 설명

N에 정수를 입력받고, N번 반복하며 정수의 배열을 입력받는 코드입니다. 위의 한 줄의 여러 정수 입력받는 것을 N번 반복했다고 보시면 됩니다. 처음에 N에 3을 입력해주고, 

1 2 3

4 5 6

7 8 9

를 입력해본 뒤, 출력해보겠습니다.

* 예시 출력

파이썬 여러개 입력받기 - paisseon yeoleogae iblyeogbadgi
숫자 배열 입력받기

2) 문자열 배열 입력받기

N=int(input()) # N개의 행
arr=[list(input()) for _ in range(N)]

* 코드 설명

위 와 비슷하지만, 문자열의 배열을 입력받는 경우도 종종 있습니다. 이런 경우 input() 함수에 list()를 감싸주면, input()으로 입력받은 문자열을 알아서 콤마(,)로 나누어 리스트에 저장해줍니다. N에 3을 입력하고,

abc

def

god

를 입력한 뒤, 결과를 출력해보겠습니다.

* 예시 출력

파이썬 여러개 입력받기 - paisseon yeoleogae iblyeogbadgi
문자 배열 입력받기

4. 입력을 빠르게 하기

import sys
input=sys.stdin.readline # input함수 바꾸기

* 코드 설명

알고리즘 문제를 풀다 보면, 시간 초과가 나는데 입력 양이 많아서, 입력시간이 오래 걸리는 경우가 생각보다 많습니다. 이런 경우 input() 함수로 코드를 짠 뒤에, 맨 위에 위 코드를 넣어주면, input함수가 sys.stdin.readline함수로 바뀝니다. 그러면 입력 속도가 엄청 빠르게 되어, 입력시간 때문에 시간 초과가 나는 경우를 해결해줍니다. 위 코드 수행후, 평소처럼 input() 함수를 사용하면, sys.stdin.readline() 함수가 작동되며, 입력속도가 빨라집니다.

5. 결론 

이상으로 정수, 정수 리스트, 여러 개 정수, 여러 줄의 정수, N행 배열(숫자, 문자열)을 Python에서 표준 입력으로 받는 방법과 입력 양이 많을 때, 빠르게 입력받는 방법을 알아보았습니다. 백준 알고리즘을 풀 때, 알아두시면 유용하게 사용하실 수 있습니다. 

읽어주셔서 감사합니다.

다음에 더욱 유익하고 재미있는 글로 찾아오겠습니다.

* 관련 깃허브

GitHub - netsus/python_practice: basic python course

basic python course. Contribute to netsus/python_practice development by creating an account on GitHub.

github.com

파이썬 여러개 입력받기 - paisseon yeoleogae iblyeogbadgi
Reference)
1. python logo: https://commons.wikimedia.org/wiki/File:Python_logo_and_wordmark.svg
2. https://tekiter.tistory.com/3#comment13056362