1-1. 입력
알고리즘 문제해결 분야에서 가장 중요하면서, 처음에 해매기 쉬운 것은 입출력입니다. Python에서 입력을 받는 경우는 다음과 같습니다.
1-1-a. 단일 입력
python의 input의 대표적인 2가지 입니다.
# 1. input을 사용한 방법
N = input()
input()
은 직관적이고, 대부분의 입력은 이 방법을 사용하면 됩니다.
제 코드의 입력을 받는 모든 방법은 이 방법을 사용합니다.
# 2. sys를 이용한 방법
# 흔히 이렇게 입출력 속도를 높이기 위해 사용하는 방법을
# fastio라고 합니다.
from sys import stdin
N = stdin.readline()
# 출력은 stdout.write를 사용
다만 python input
함수는 속도가 다른 언어(c++)에 비해 느린 편입니다. 그렇기에 입력이 많다면 sys
라이브러리를 사용하여 더 빠르게 입력을 받을 수 있습니다.
이런 입력을 정수로 변환하는 것은 형변환을 사용하면 됩니다.
N = int(input())
문장을 받고 문자를 개별로 나누고 싶다면 다음처럼 하면 됩니다.
lst = list(input())
1-1-b. 공백으로 구분된 입력
python은 입력을 문장 단위로 받습니다. 문장이 줄별로 들어오면 괜찮겠지만 한 줄에 모두 들어오는 경우가 있으니 신경써야 합니다.
# 1. 단어별 분리
lst = input().split() # 기본적으로 공백으로 분리
lst = input().split(',') # , 으로 분리
하지만 입력은 수치로 변환해주는 과정이 있고, 각 입력마다 정수로 변환해주어야 합니다. 이 경우에는 map을 사용하여 변환하면 됩니다. (물론 반복문으로 변환 가능합니다.)
# 2. 변환은 map 사용, tuple to tuple
N, M = map(int, input().split())
입력의 개수가 정해진 것이 아니거나 변수로 표현하기 어렵다면 배열로 받으면 됩니다.
# 3. 배열의 입력은 list로 변환
arr = list(map(int, input().split()))
1-2. 출력
1-2-a. fstring
python에서 출력하는 방식은 다양하지만 f-string을 사용하는 것을 추천합니다.
N = 100
print(f'{N} won') # 100 won
기본적인 정수형 데이터와 문자열 데이터는 쉽게 할 수 있고, 소수점 표현도 간단하게 표현할 수 있습니다.
N = 12.3
print(f'{N:.2f}')
그 외에도 많은 방법들이 있으니 필요시에 찾으면 됩니다.
1-2-b. join 메서드
배열 내의 출력은 반복문으로 하는 방법은 다음과 같습니다.
for i in lst:
print(lst, end=' ')
뒤의 end
는 \n
, 즉 줄을 넘지말고, 공백으로 출력을 이어가겠다는 의미입니다.
하지만 python의 반복문은 느린편이기에 다음과 같이 쓰는게 더 좋습니다.
print(' '.join(lst))
1-3. 초기화
동적 계획법이나 여러 전처리를 위한 배열을 선언할 때, 빈 배열을 만드는 경우가 생깁니다. 이때는 다음과 같이 배열을 초기화 합니다.
arr_1d = [0 for _ in range(N)]
arr_2d = [[0 for _ in range(N)] for _ in range(N)]
이 방법은 List comprehension이라고 부릅니다. Set, Dict 등에도 적용할 수 있습니다. 이는 후에 문제 풀이에서 사용해보겠습니다.
또한 특정 상수나 문자열을 사용하는 경우에는 미리 선언하는 것이 좋습니다. 예시로 날짜를 계산하는 문제에서 월별로 조건문을 쓰는 방법이 있습니다.
# bad case
for i in range(1, X):
if mon == 1 : day += 31
if mon == 2 : day += 28
if mon == 3 : day += 31
# 4, 5, 6, ... 12
# good case
month = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
for i in range(1, X):
day += month[mon]