입출력

김상윤·2022년 1월 20일
0

python

목록 보기
1/13

입력

  • input()
    : "개행을 기준으로" 데이터를 입력 받아서 '문자열'로 리턴
  • python은 c++의 getline()과 유사하게 수행한다.
    : 한 줄 입력
x = input()
  • c++의 cin처럼 whitespace 기준으로 입력 받으려면
    : input() 이후 split()으로 쪼개줘야 한다.
a, b = input().split()
a, b, c = input().split()
#list elements로 다중할당, 변수 개수만큼만 입력해야 실행 가능
#각 변수 = str type

split()
: str의 내장함수
: s.split()
: 문자열을 whitespace를 기준으로 쪼개서 각 문자열을 elements로 갖는 list 리턴
split("x")
: 문자열을 구분자 x를 기준으로 쪼개서 각 문자열을 elements로 갖는 list 리턴
: "연속된 구분자는 묶이지 않고 빈 문자열을 구분하는 것으로 간주합니다"
: split()에서는 공백 3개가 연달아 와도 하나의 whitespace로 간주하지만, (" ")공백문자가 구분자로 주어지고 공백 3개가 연달아 오면 (" ")공백문자 2개는 list에 element로 들어간다.

  • input("hello")
    : "hello"출력 후 데이터를 입력 받아서 '문자열'로 리턴

input활용

정수 여러개 입력 받기

  • '정수' 여러개 입력받아 list로 저장
a = [int(x) for x in input().split()]
a, b, c = [int(x) for x in input().split()]
#list elements로 다중할당, 변수 개수만큼만(3개) 입력해야 실행 가능
  • '정수' 여러개 입력받아 list로 저장 -2
a = list(map(int, input().split()))

print(input().split()) # list
print(type(map(int, input().split()))) #map object
print(type(a)) #list
  • map(함수, sequential 객체)
    : 객체의 모든 원소에 각각 함수를 동작시켜 그 결과를 map 객체로 return
  • 개행 n개 입력받아 list로 저장
n = int(input())
numbers = [int(input()) for _ in range(n)]

빠른 입력

  • 맨 끝의 개행문자까지 같이 입력받기 때문에 문자열을 저장하고 싶을 경우 .rstrip()을 추가로 해 주는 것이 좋다.
  • 숫자로 전환은 문제없음
# 이게 빠르다함
import sys
str = sys.stdin.readline()
# hello world\n
str = sys.stdin.readline().rstrip()
# hello world
num = int(sys.stdin.readline())
# 365
nums = [int(x) for x in sys.stdin.readline().split()]
# [1 3 365]

행렬(2차원배열) 입력받기

arr = [0 for _ in range(k)]
for i in range(k):
  arr[i] = [int(x) for x in input().split()]
arr = []
for i in range(k):
  arr.append([int(x) for x in input().split()])
arr = [list(map(int, input().split())) for _ in range(k)]
arr = [[int(x) for x in input().split()] for _ in range(k)]
  • 띄어쓰기 없이 정수 여러개 입력받기
arr = [[int(x) for x in input()] for _ in range(n)]

여러가지 algorithm 입력 예제

(1, 1)부터 시작하는 2차원 배열 입력 받기

cost = [[0] for _ in range(n+1)]
for i in range(1, n+1):
  cost[i] = cost[i] + [int(x) for x in input().split()]

공백 없이 입력받기

map = [[] for _ in range(m)]
for i in range(m):
  s = input()
  map[i] = [int(a) for a in s]
map = []
for i in range(m):
  l = [int(x) for x in input()]
  map.append(l)

공백 없이 값 변환해서 입력 받기

: if문, for을 동시에 one-line으로

map = [[] for _ in range(m)]
for i in range(m):
  s = input()
  map[i] = [0 if a=="." else 2 for a in s]

정보 없이 여러 줄 입력받기

import sys

# sys.stdin에서 한 줄씩 읽어와 line 변수에 할당
# 입력이 끝나면(EOF) 루프가 자동으로 종료됨
for line in sys.stdin:
    # line 변수에는 각 줄의 문자열이 들어있고, 끝에 개행문자(\n)가 포함됨
    # 개행문자를 제거하려면 .strip() 또는 .rstrip() 사용
    processed_line = line.strip()
    
    # 읽어들인 데이터로 원하는 처리 수행
    print(f"입력받은 내용: {processed_line}")

print("입력이 모두 끝났습니다.")
  • sys.stdin은 파일 객체이자 이터러블(Iterable)이다.
  • 온라인 코딩 테스트 환경: 보통 미리 준비된 테스트 케이스 입력이 표준 입력(stdin)으로 리다이렉션되므로, 프로그램은 입력의 끝에서 자동으로 EOF를 감지하고 종료됩니다. 위 코드를 그대로 사용하면 됩니다.
  • Linux / macOS: 코드를 실행하고 터미널에 여러 줄을 입력한 뒤, Ctrl + D를 눌러 파일 끝(EOF, End-of-File) 신호를 보내면 루프가 종료됩니다.
import sys

while True:
    line = sys.stdin.readline()
    if not line:  # readline()은 EOF에서 빈 문자열('')을 반환
        break
    
    processed_line = line.strip()
    print(f"입력받은 내용: {processed_line}")
  • 원리: sys.stdin.readline()은 한 줄을 읽고, 더 이상 읽을 내용이 없으면(EOF) 빈 문자열('')을 반환합니다. 이를 이용해 while 루프의 종료 조건을 명시적으로 작성하는 방식입니다.
  • 평가: for 루프와 성능/메모리 효율성은 동일합니다. 하지만 코드가 더 길고, 종료 조건을 직접 확인해야 하므로 덜 파이썬다운 방식으로 평가됩니다.

출력

  • print(x)
    : 변수 x의 value 출력
  • print함수는 출력 후 '\n'개행문자 출력이 default
    -> 변경 하고 싶으면
print(i, end=' ') 
//출력 후 개행하지 않고 띄어쓰기

문자열 출력

  • print("aaa""bbb")
    = print("aaa" + "bbb")
  • print("aaa", "bbb")
    = print("aaa" + " " + "bbb")

문자열 + 변수 출력

  • print("a={}, b={}".format(a,b) )
    = print(f"a={a}, b={b}")
    = print("a=" + str(a) + ", b=" + str(b))
  • print("a=",a)
    = print("a=" + " " + str(a))
  • print("a={}, b={}".format(*list))
    = print("a=" + str(list[0]) + ", b=" + str(list[1]))

길이, 자리수 출력 포맷

list 출력

  • elements들만 공백과 함께 출력
l = [1, 3, 5]
print(*l) # 1 3 5

참고

https://docs.python.org/ko/3/library/stdtypes.html?highlight=split

0개의 댓글