05. 입출력
1. 입력 방법
(1) 입력
- 알고리즘 문제 풀이의 첫번째 단계는 데이터를 입력받는 것
→ 알고리즘 문제의 경우 적절한 입력이 주어졌을 때, 그 입력을 받아서 적절한 알고리즘을 수행한 뒤의 결과를 출력하는 것을 요구하기 때문
예) 학생의 성적 데이터가 주어지고, 이를 내림차순으로 정렬한 결과를 출력하는 문제
→ 일반적으로 입력과정에서는 먼저 데이터의 개수가 첫번째 줄에 주어지고, 처리할 데이터는 그 다음줄에 주어지는 경우가 많음
=> 즉, 첫번째 줄에 학생의 수가 주어지고, 두번째 줄에 학생의 정보가 주어지며, 정보는 공백으로 구분함
- 대부분 문제에서의 입력 예시와 출력 예시는 다음과 같은 형태를 보일 것
<입력 예시>
5
65 90 75 34 99
<출력 예시>
99 90 75 65 34
- 파이썬에서 데이터를 입력받을 때는 input()을 이용
→ 한 줄의 문자열을 입력받도록 해줌
- 입력받은 데이터를 정수형 데이터로 처리하기 위해서는 문자열을 정수로 바꾸는 int()함수 사용
- 여러 개의 데이터를 입력받을 때는 데이터가 공백으로 구분되는 경우가 많음
→ 입력받은 문자열을 띄어쓰기로 구분하여 각각 정수 자료형의 데이터로 저장하는 코드의 사용 빈도가 매우 높음
=> list(map(int, input().split()))을 이용하면 됨
☑ list(map(int, input().split()))의 동작 과정
→ 가장 먼저 input()으로 입력받은 문자열을 split()을 이용해 공백으로 나눈 리스트로 바꾼 뒤 map을 이용해 해당 리스트의 모든 원소에 int()함수를 적용
=> 최종적으로 그 결과를 list()로 다시 바꿈으로써 입력받은 문자열을 띄어쓰기로 구분하여 각각 숫자 자료형으로 저장하게 되는 것
✓ 이 코드는 정말 많이 사용되므로 반드시 외우고 있어야 함
(2) 줄바꿈, 공백
- 많은 문제는 공백 혹은 줄바꿈을 기준으로 데이터 구분
- 줄바꿈이라면 int(input())을 여러 번 사용하면 됨
<입력을 위한 전형적인 소스코드>
# 데이터의 개수 입력
n = int(input())
# 각 데이터를 공백으로 구분하여 입력
data = list(map(int, input().split()))
data.sort(reverse=True)
print(data)
- 공백으로 구분된 데이터의 개수가 많지 않다면 단순히 map(int, input().split())을 이용하는 것도 가능
<공백을 기준으로 구분하여 적은 수의 데이터 입력>
# n, m, k를 공백으로 구분하여 입력
n, m, k = map(int, input().split())
print(n, m, k)
- 문제를 풀다보면, 입력을 최대한 빠르게 받아야 하는 경우가 있음
→ 정렬, 이진 탐색, 최단 경로 문제의 경우 매우 많은 수의 데이터가 연속적으로 입력이 되곤 함
예) 1,000만 개가 넘는 라인이 입력되는 경우, 입력을 받는 것만으로도 시간초과를 받을 수 있음
✎ 각 데이터가 공백으로 구분되어 입력되는게 아니라 한 줄마다 입력되는 경우도 존재
∴ 입력을 더 빠르게 받는 방법을 알고 있어야 함
(3) readline
- 입력의 개수가 많은 경우 단순히 input()함수를 그대로 사용하지는 않음
→ input()함수는 동작속도가 느려서 시간초과로 오답판정을 받을 수 있기 때문
- 이 경우 파이썬의 sys 라이브러리에 정의되어 있는 sys.stdin.readline()함수를 이용
import sys
sys.stdin.readline().rstrip()
- sys 라이브러리 사용시 한 줄 입력을 받고 나서 rstrip()함수를 꼭 호출해야 함
→ readline()으로 입력하면 입력 후 엔터가 줄바꿈 기호로 입력되는데, 이 공백 문자를 제거하려면 rstrip()함수를 사용해야 함
<readline() 사용 소스코드 예시>
import sys
# 문자열 입력받기
data = sys.stdin.readline().rstrip()
print(data)
2. 출력 방법
(1) 출력
- print()를 이용
- print()는 변수나 상수를 매개변수로 입력받아 이를 표준 출력으로 출력
- print()는 각 변수를 콤마(,)로 구분하여 매개변수로 넣을 수 있는데, 이 경우 각 변수가 띄어쓰기로 구분되어 출력됨
<변수 출력 예시>
# 출력할 변수들
a = 1
b = 2
print(a, b)
<출력>
1 2
(2) 줄바꿈
- print()는 기본적으로 출력 이후에 줄바꿈을 수행
→ print()를 사용할 때마다 줄이 변경된다고 볼 수 있음
<출력 줄 바꿈 예시>
# 출력할 변수들
a = 1
b = 2
print(a)
print(b)
<출력>
1
2
(3) 출력 시 오류 발생
- 문자열과 수를 함께 출력해야 되는 경우 단순히 더하기(+) 연산자를 이용해 문자열과 수를 더하면 오류가 발생
✎ 자바와 같은 일부 프로그래밍 언어에서는 문자열과 수를 더하는 연산을 수행하면, 자동으로 수 데이터가 문자열로 자료형이 변환되면서 더해지는데 파이썬은 해당되지 않는 점 꼭 기억!!
<출력 시 오류가 발생하는 소스코드 예시>
# 출력할 변수들
answer = 7
print("정답은 " + answer + "입니다.")
<출력>
TypeError: can only concatenate str (not "int") to str
→ 문자열 자료형끼리만 더하기 연산이 가능하다는 오류 메시지
=> 이 경우 2가지 방법으로 해결할 수 있음
(4) 오류 해결 방법
1. str()함수를 이용하여 출력하고자 하는 변수 데이터를 문자열로 바꾸어 주는 방법
# 출력할 변수들
answer = 7
print("정답은 " + str(answer) + "입니다.")
<출력>
정답은 7입니다.
2. 각 변수를 콤마(,)로 구분하여 출력
# 출력할 변수들
answer = 7
print("정답은", str(answer), "입니다.")
<출력>
정답은 7입니다.
※ 각 변수를 콤마로 구분하여 출력하는 경우, 변수의 값 사이에 의도치 않은 공백이 삽입될 수 있다는 점을 신경 써줄 것
(5) f-string 문법
- f-string 문법을 사용할 수 있음
→ 문자열 앞에 접두사 f를 붙임으로써 사용할 수 있는데, f-string을 이용하면 단순히 중괄호({})안에 변수를 넣어 자료형의 변환 없이도 간단히 문자열과 정수를 함께 넣을 수 있음
answer = 7
print(f"정답은 {answer}입니다.")
<출력>
정답은 7입니다.
<reference(참조)>
나동빈(2020).<이것이 취업을 위한 코딩 테스트다 with 파이썬>.서울: 한빛미디어(주)