뚝딱햄 탈출기

[Python] 입출력 : input(), sys.stdin.readline(), print(), 줄 바꿈 본문

Programming language/Python

[Python] 입출력 : input(), sys.stdin.readline(), print(), 줄 바꿈

hyrmzz1 2023. 10. 3. 20:57
이것이 취업을 위한 코딩 테스트다 with 파이썬 - 나동빈 저
APPENDIX A. 코딩 테스트를 위한 파이썬 문법 정리 내용

입력

input()

파이썬에서 데이터를 입력받을 때 input()을 이용한다. input()은 한 줄의 문자열을 입력받도록 해준다.

입력받은 데이터를 정수형 데이터로 처리하려면 문자열을 정수로 바꾸는 int() 함수를 사용해 주면 된다.

여러 개의 데이터를 입력받을 때

많은 코딩 테스트 문제들이 여러 개의 데이터를 입력받을 때 공백 혹은 줄 바꿈을 기준으로 데이터를 구분한다.

파이썬에서는 구분자가 줄바꿈인지 공백인지에 따라 다른 처리를 요구한다.

 

구분자가 줄바꿈이라면 int(input())을 여러 번 사용하면 되고,

 

구분자가 공백이라면 아래의 방식을 사용한다. 이 코드는 반드시 외우고 있어야 한다! 
입력받은 문자열을 띄어쓰기로 구분해 각각 정수 자료형의 데이터로 저장하는 코드의 사용 빈도가 매우 높다.

list(map(int, input().split()))

동작 방식을 알아보자.

 

  1. input()으로 입력받은 문자열을 공백으로 나눈 리스트로 바꾼다.
  2. map()을 이용해 해당 리스트의 모든 원소에 int() 함수를 적용해 문자열을 정수로 변환한다.
    map() 함수는 각 요소들에 특정한 함수를 적용시키는 함수로, map(적용시킬 함수, 함수를 적용할 값들) 형태로 작성한다.
  3. map() 함수의 반환 값은 map 객체이기 때문에 list()를 통해 list 자료형으로 변환한다.
  4. 그 결과 입력받은 문자열을 띄어쓰기로 구분해 하나의 리스트 안에 각각 숫자 자료형으로 저장하게 된다.  
# 코딩 테스트에서 입력을 위해 사용되는 전형적인 소스코드

# 데이터 개수 입력
n = int(input())
# 각 데이터를 공백으로 구분하여 입력
data = list(map(int, input().split()))	# 65 15 74 89 34
print(data)	# [65, 15, 74, 89, 34]

공백으로 구분된 데이터의 개수가 많지 않다면 단순히 map(int, input().split())을 이용하는 것도 가능하다. (위 동작방식의 3번 생략 가능)

# 공백을 기준으로 구분해 적은 수의 데이터 입력
# a, b, c를 공백으로 구분해 입력
a, b, c = map(int, input().split())	# 6 5 4
print(a, b, c)	# 6 5 4

+) map() 부분 참고

2023.10.03 - [Programming language/Python] - [Python] 함수 : 함수의 구조 def, global, 람다 표현식 lambda express, map()

 

[Python] 함수 : 함수의 구조 def, global, 람다 표현식 lambda express, map()

이것이 취업을 위한 코딩 테스트다 with 파이썬 - 나동빈 저 APPENDIX A. 코딩 테스트를 위한 파이썬 문법 정리 내용 함수 동일한 알고리즘을 반복적으로 사용해야 할 때 함수를 사용한다. 똑같은 코

hyrmzz1.tistory.com

sys.stdin.readline()

코딩 테스트 문제를 풀 때, 입력을 최대한 빠르게 받아야 하는 경우가 있다.

흔히 정렬, 이진 탐색, 최단 경로 문제의 경우 매우 많은 수의 데이터가 연속적으로 입력 되곤 하는데, 예를 들어 1,000만 개가 넘는 라인이 입력된다면(각 데이터가 공백으로 구분되어 입력되는 게 아니라 한 줄마다 입력되는 경우도 있으니) 입력을 받는 것만으로도 시간 초과를 받을 수 있다.

 

input() 함수는 동작 속도가 느려 시간 초과로 오답 판정을 받을 수 있기 때문에,
입력의 개수가 많은 경우엔 파이썬의 sys 라이브러리에 정의되어 있는 sys.stdin.readline() 함수를 이용한다.

sys.stdin.readline() 함수는 input() 함수와 같이 한 줄씩 입력받기 위해 사용한다.

import sys
sys.stdin.readline().rstrip()

sys 라이브러리를 사용할 때는 한 줄 입력을 받고 나서 rstrip() 함수를 반드시 호출해야 한다.

readline()으로 입력하면 입력 후 엔터가 줄 바꿈 기호로 입력되기 때문에 이 공백 문자를 제거하기 위해 rstrip() 함수를사용한다.

# readline() 사용 예시
import sys

# 문자열 입력받기
data = sys.stdin.readline().rstrip()	# Hello World
print(data)	# Hello World

공백으로 구분된 여러 개의 입력값 받기

import sys
a = list(map(int, sys.stdin.readline().split()))	# map 함수의 반환값은 map 객체이므로 list로 형변환

sys.stdin.readline()은 문자열로 입력받기 때문에, 입력받은 문자열을 정수 혹은 실수, 리스트로 사용할 때는 적절하게 함수를 사용하여 처리를 해주어야 한다 !!

여러(n) 라인에 걸쳐 입력값 받기

import sys
# solution 1 - 리스트 컴프리헨션 사용 (리스트 초기화까지 한번에!)
a = [int(sys.stdin.readline()) for i in range(n)]
    
# solution 2 - solution 1보다 더 간단하게 작성할 수도 있다.
a = [int(sys.stdin.readline()) for _ in range(int(sys.stdin.readline()))]

# solution 3
a = []
for i in range(n):
	a.append(int(sys.stdin.readline()))

0부터 (n - 1)까지 총 n번 반복하면서 각 반복에서 한 줄을 읽고 정수로 변환한 값을 a라는 리스트에 넣는다.

출력

print()

print()는 변수나 상수를 매개변수로 입력받아 이를 표준 출력으로 출력한다.

변수 여러 개 한 번에 출력하기

매개변수를 여러 개 입력받을 수 있는데, 각 변수를 콤마(,)로 구분하여 매개변수로 넣으면 된다. 이 경우 각 변수가 띄어쓰기로 구분되어 출력된다.

a = 1
b = 2
print(a, b)	# 1 2

더하기 연산자(+)를 이용해 여러 문자열을 연결하여 출력할 수 있다.

a = "Hello"
b = "World"
print(a + " " + b)	# Hello World

 

더하기 연산자로 연결하여 출력하는 것은 문자열 자료형끼리만 가능하기 때문에 문자열과 수를 함께 출력하는 경우, 더하기 연산자(+)를 이용하면 오류가 발생한다.

 

문자열과 수를 함께 출력하려면

 

  • str() 함수를 이용해 문자열이 아닌 변수 데이터를 문자열로 변환한 후 더하기 연산자를 이용한다.
    => 문자열끼리는 더하기 연산자로 연결 가능!
  • 각 변수를 콤마(,)를 기준으로 구분하여 출력한다.
    => 이 경우 변수 사이에 공백이 삽입된다.
  • f-string 문법을 사용하면 자료형의 변환 없이 문자열과 정수를 함께 넣을 수 있다. (Python 3.6 이상의 버전에서만)
    문자열 앞에 접두사 'f'를 붙이고, 중괄호({}) 안에 변수를 넣는다. 
# 문자열과 수를 더하기 연산자(+)를 이용해 함께 출력한다면
print("행운의 숫자" + 7)	# 에러 발생

# str() 함수 이용
print("행운의 숫자" + str(7))	# 행운의 숫자7

# 콤마(,) 이용
print("행운의 숫자", 7)	# 행운의 숫자 7

# f-string 이용
num = 7
print(f'행운의 숫자 {num}')	# 행운의 숫자 7

줄 바꿈

print()는 기본적으로 출력 이후에 줄 바꿈을 수행한다.

그 이유는 print() 내장 함수에서 end 파라미터의 기본값이 '\n' 이기 때문이다.

print("Hello")
print("World")
'''
실행 결과
Hello
World
'''

따라서 줄 바꿈 없이 출력하고 싶다면 print() 함수의 end 파라미터 값을 없애주면 된다. (''로 변경)

end 파라미터 값을 공백(' ')으로 바꾸면 문자열 끝에 개행 문자 '\n' 대신 공백이 추가된다.

print("Hello", end = "")
print("World")
'''
실행 결과
HelloWorld
'''

print("Hello", end = " ")
print("World")
'''
실행 결과
Hello World
'''

개행 문자 '\n'을 출력문(문자)에 추가하면 하나의 print()를 사용하더라도 줄 바꿈이 가능하다.

print("Hello\nWorld")
'''
실행 결과
Hello
World
'''
Comments