* 전체 코드
### 정수 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에 들어갑니다.
* 예시 출력
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함수])
* 예시 출력
3) 한 줄의 여러 정수 입력받기 - 여러 변수로
a,b,c = map(int,input().split())
* 코드 설명
위 코드에서 [* ] 부분을 제외한 것입니다. input().split()으로 나눠진 리스트 원소 개수와 똑같이 변수 개수를 써줘야 합니다. 즉, 위 코드를 실행했을 때, 원소가 3개가 되게 입력해야, 그것이 차례로 a, b, c에 들어갑니다. map() 함수 실행 결과는 위처럼 여러 변수에 바로 할당할 수 있다는 장점이 있습니다. 위 코드를 실행하고 "1 2 3"을 입력한 뒤, 출력해보겠습니다. (변수, 변수, 변수 이런 식으로 사용하면 아래처럼 자동으로 튜플 형태로 반환됩니다.)
* 예시 출력
4) 여러 줄의 정수 입력받기
n = int(input()) # 입력 받을 정수 개수
li = [int(input()) for _ in range(n)]
* 코드 설명
처음에 n에 입력받을 정수 개수를 사용자로부터 입력받습니다. 그리고 리스트컴프리헨션을 이용해 n번 반복하면서 n개 줄의 정수를 입력받아 li에 리스트로 할당합니다. n에 3을 입력하고, 1 2 3을 차례로 입력한 뒤, 출력해보겠습니다.
* 예시 출력
백준에서 알고리즘 문제를 풀다 보면, 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
를 입력해본 뒤, 출력해보겠습니다.
* 예시 출력
2) 문자열 배열 입력받기
N=int(input()) # N개의 행
arr=[list(input()) for _ in range(N)]
* 코드 설명
위 와 비슷하지만, 문자열의 배열을 입력받는 경우도 종종 있습니다. 이런 경우 input() 함수에 list()를 감싸주면, input()으로 입력받은 문자열을 알아서 콤마(,)로 나누어 리스트에 저장해줍니다. N에 3을 입력하고,
abc
def
god
를 입력한 뒤, 결과를 출력해보겠습니다.
* 예시 출력
4. 입력을 빠르게 하기
import sys
input=sys.stdin.readline # input함수 바꾸기
* 코드 설명
알고리즘 문제를 풀다 보면, 시간 초과가 나는데 입력 양이 많아서, 입력시간이 오래 걸리는 경우가 생각보다 많습니다. 이런 경우 input() 함수로 코드를 짠 뒤에, 맨 위에 위 코드를 넣어주면, input함수가 sys.stdin.readline함수로 바뀝니다. 그러면 입력 속도가 엄청 빠르게 되어, 입력시간 때문에 시간 초과가 나는 경우를 해결해줍니다. 위 코드 수행후, 평소처럼 input() 함수를 사용하면, sys.stdin.readline() 함수가 작동되며, 입력속도가 빨라집니다.
5. 결론
이상으로 정수, 정수 리스트, 여러 개 정수, 여러 줄의 정수, N행 배열(숫자, 문자열)을 Python에서 표준 입력으로 받는 방법과 입력 양이 많을 때, 빠르게 입력받는 방법을 알아보았습니다. 백준 알고리즘을 풀 때, 알아두시면 유용하게 사용하실 수 있습니다.
읽어주셔서 감사합니다.
다음에 더욱 유익하고 재미있는 글로 찾아오겠습니다.
* 관련 깃허브
Reference)
1. python logo: https://commons.wikimedia.org/wiki/File:Python_logo_and_wordmark.svg
2. https://tekiter.tistory.com/3#comment13056362
'Programming > 알고리즘' 카테고리의 다른 글
[백준] 1463 1로 만들기 (DP) - Python / 자세한 설명 / 여러가지 풀이 / 실버1 (6) | 2022.07.25 |
---|---|
[백준] 2579 계단 오르기 (DP) - Python / 자세한 설명 / 실버3 (0) | 2022.07.24 |
[백준] 2156 포도주 시식 - Python 자세한 설명 (DP, 숏코딩) (0) | 2022.07.21 |
[백준] 2294 동전 2 - Python (DP) (0) | 2022.07.19 |
[백준] 2606 바이러스 - Python (그래프 탐색) (7) | 2022.07.17 |