다른 언어 쓰다가 파이썬 쓰려니 헷갈려서 글로 따로 정리해놨다.
파이썬에서는 보통 input() 함수를 이용해서 입력을 처리한다.
이 함수는 사용자가 입력한 값을 항상 문자열(str)로 반환한다.
예시
name = input("이름을 입력하세요: ") print(f"안녕하세요, {name}님!")매개변수로 받은 문자열을 화면 상에 출력한 후, 사용자가 입력한 값을
name변수에 저장한다. 그 다음
input 함수는 항상 문자열을 반환한다. 만약 숫자를 입력받아서 활용하고자 한다면 형 변환이 요구된다.
예시1 (정수 입력)
age = int(input("나이를 입력하세요: ")) print(f"제 나이는 {age}살 입니다.")
int()함수를 통해 입력값을 정수로 변환시킬 수 있다.
예시2 (실수 입력)
height = float(input("키를 입력하세요 (cm): ")) print(f"당신의 키는 {height}cm입니다.")비슷하게
float()함수를 통해 입력값을 실수로 변환시킬 수 있다.
만약 사용자가 여러 개의 값을 입력한다면 어떻게 해야할까?
그럴 땐 split() 함수를 활용하면 된다.
예시1 (여러 개의 문자열 입력받기)
nameList = input("참여하는 사람들을 입력하세요 (공백으로 구분): ").split() print(f"참여하는 사람: {nameList}")결과
참여하는 사람들을 입력하세요 (공백으로 구분): 신희 난형 시우 참여하는 사람: ['신희', '난형', '시우']
split()함수는 입력된 문자열을 공백을 기준으로 나눠서 문자열 리스트를 반환한다.
그럼 여러 개의 데이터를 입력받은 다음 형 변환을 해야할 때는 어떻게 해야할까?
이럴 때를 위해 map() 함수가 있다.
map() 함수는 map(함수, 반복 가능한 객체) 이런 구조를 가지고 있으며,
각 요소마다 함수를 적용하고 그 값이 포함된 map객체를 반환한다.
map객체에 데이터가 저장되지만 사용자가 이 값을 직접 볼 수 없다.
따라서 출력할 땐list() 등을 써서 출력해줘야 한다.
예시2 (여러 개의 정수 입력받기)
numList = map(int ,input("값들을 입력하세요 (공백으로 구분): ").split()) print(f"입력한 값: {list(numList)}") # 데이터를 읽기 위해선 list()로 감싸줘야 함.결과
값들을 입력하세요 (공백으로 구분): 1 5 3 입력한 값: [1, 5, 3]
예시3 (두 개의 정수 입력 받기)
a, b = map(int, input("두 수를 입력하세요 (공백으로 구분): ").split()) print(f"두 수의 합: {a + b}")결과
두 수를 입력하세요 (공백으로 구분): 3 5 두 수의 합: 8
대부분의 상황에선 편리적인 input() 함수를 사용해도 큰 문제는 없으나,
코딩 테스트처럼 처리 시간이 중요한 상황에서 input() 함수는 문제가 생길 수도 있다.
(예시 : 백준 BOJ 15552번)
이럴 때는 sys 모듈을 import한 후에 sys.stdin.readline() 함수를 사용하는 것으로 해결할 수 있다.
input()함수 내부적으로 sys.stdin.readline()을 호출하기에 둘은 기능적으로 유사하지만 input()은 sys.stdin.readline()와 다르게
\n)를 자동으로 제거한다.input("값을 입력해주세요"))이로 인해 input()함수가 sys.stdin.readline()보다 느리다.
그렇기에 코딩 테스트 같이 많은 양의 데이터를 반복적으로 처리해야하는 케이스에선 input()보단 sys.stdin.readline()을 사용하는 것이 좋다.
sys.stdin.readline()sys.stdin.readline()는 반환값에 개행 문자를 제거하지 않는다.
따라서 입력값을 활용할 땐 이를 고려해야 한다.
예시
import sys name = sys.stdin.readline().strip() # 개행 문자 제거 print(f"제 이름은 {name}입니다.")결과
시우 제 이름은 시우입니다.
예시2
import sys phoneList = sys.stdin.readline().split() print(phoneList)결과
S99 IPHONE99 G5 ['S99', 'IPHONE99', 'G5'] #split()을 통해 개행 문자도 같이 제거
이제 코딩 테스트에서 자주 볼 수 있는 2차원 배열 입력 데이터를 파이썬으로 어떻게 처리해야 할지 알아보자
입력값
3 5 6 8 2 6 2 3 2 3 4 6 6 7 3 3 2
예시1
import sys rows, cols = map(int, sys.stdin.readline().split()) matrix = [] for r in range(rows): matrix.append(list(map(int, sys.stdin.readline().split()))) print(matrix)결과
[[6, 8, 2, 6, 2], [3, 2, 3, 4, 6], [6, 7, 3, 3, 2]]
리스트 컴프리헨션을 사용하면 반복문을 대체할 수 있다.
예시2
import sys n, m = map(int, sys.stdin.readline().split()) matrix = [list(map(int, sys.stdin.readline().split())) for _ in range(n)] print(matrix)결과
[[6, 8, 2, 6, 2], [3, 2, 3, 4, 6], [6, 7, 3, 3, 2]]
만약 입력 케이스가 공백이나 쉼표,로 구분되어 있지 않다면 어떻게 받아야할까?
그럴 땐 split() 메서드 대신 strip() 메서드를 사용해주면 된다.
입력
4 5 00100 01110 11111 10011
예시
import sys rows, cols = map(int, sys.stdin.readline().split()) matrix = [] for r in range(rows): matrix.append(list(map(int, sys.stdin.readline().strip()))) print(matrix)결과
[[0, 0, 1, 0, 0], [0, 1, 1, 1, 0], [1, 1, 1, 1, 1], [1, 0, 0, 1, 1]]
이 경우에도 동일하게 리스트 컴프리헨션을 사용 가능하다.