본 포스팅은 파이썬으로 알고리즘 문제를 풀 때 사소하지만 자주 등장하는 문법들을 자꾸 까먹는 탓에 작성하게 되었다. 당장은 나를 위해 기록해두는 것이긴 하지만 훗날 누군가에게 조금이나마 도움이 되었음 좋겠다.

대부분의 언어에서 몫을 구할 때는 / 를, 나머지를 구할 때는 % 를 사용한다.
파이썬도 이와 비슷하지만 / 연산 결괏값에 차이가 있다.
파이썬에서는 / 연산자는 말 그대로 '나눗셈'을 할 때 사용하고,
// 연산자는 '몫'을 구하는 데 사용한다.
print(5 / 2) # 2.5
print(5 // 2) # 2
나머지를 구하는 방법은 기존 다른 언어들과 동일하게 % 연산자를 사용하면 된다.
이때 아래와 같이 몫과 나머지를 한 번에 구하는 것도 가능하다.
print(divmod(5, 2)) # (2, 1)
입력을 받는 방법은 매우 간단하다.
input 함수를 통해 값을 입력 받을 수 있으며 이때 자료형은 string이다.
n = input()
print(type(n)) # <class 'str'>
그렇다면 한 줄에 여러 값을 입력 받고 싶을 때는 어떻게 작성하면 될까?
input 함수로 입력 받은 값을 split 함수를 이용하여 공백을 기준으로 쪼갠다.
a, b, c = input().split()
map 함수의 첫 번째 인자로 원하는 자료형을 넘겨주면 리스트의 모든 요소를 해당 자료형으로 손쉽게 변환할 수 있다.
a, b, c = map(int, input().split())
이때, 하나의 변수에 반환값을 담으면 자료형이 map 객체이므로 아래와 같이 알맞게 형 변환을 하여 사용하면 된다.
map_list = list(map(int, input().split()))
map_tuple = tuple(map(int, input().split()))
.
.
.
입력 데이터의 개수가 많은 문제에 input() 함수를 사용하면 동작 속도가 느려 시간 초과로 오답 판정을 받을 수 있다.
input() 함수 대신 sys 라이브러리의 readline() 함수를 사용하면 간단히 해결 가능하다.
이때 엔터가 줄 바꿈 기호로 함께 입력되므로 해당 공백 문자를 제거하려면 rstrip() 함수를 사용해야 한다.
따라서 sys.stdin.readline().rstrip()을 통째로 암기하여 사용하는 것이 편리하다.
import sys
input_data = sys.stdin.readline().rstrip()
print(input_data)
'소수점 이하 첫째 자리에서 반올림한 값을 출력하라.' 와 같이 특정 소수점 자리에서 반올림을 하라는 지시문이 주어질 때가 있는데 반올림한 값을 구하는 방법으로 아래 두 방법을 정리해두고자 한다.
1) round()
round() 함수의 두 번째 인자로 소수점 몇 번째 자리까지 나타낼지 넘겨주면 된다.
round() 함수로 구한 값의 자료형은 float형이다.
n = 0.123456789
print(round(n)) # 0
print(round(n, 1)) # 0.1
print(round(n, 2)) # 0.12
print(round(n, 3)) # 0.123
2) format 서식 지정
n = 0.123456789
print("{:.0f}".format(n)) # 0
print("{:.1f}".format(n)) # 0.1
print("{:.2f}".format(n)) # 0.12
print("{:.3f}".format(n)) # 0.123
이외에 올림과 내림은 math 모듈로 간단히 값을 구할 수 있는데 각각 ceil(), floor() 함수를 사용하면 된다.
순열과 조합 문제를 풀면서 공부한 두 가지의 모듈에 대해 정리해보려고 한다.
참고로 순열은 permutation, 조합은 combination이다.
1) itertools 모듈 - n개의 원소를 가진 리스트가 주어진 경우, 또는 각 경우의 수를 구해야 하는 경우
# 1) itertools 모듈을 사용하는 소스코드
import itertools
nPr = itertools.permutations([1, 2, 3], 2)
nCr = itertools.combinations([1, 2, 3], 2)
print(list(nPr)) # [(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)]
print(list(nCr)) # [(1, 2), (1, 3), (2, 3)]
2) math 모듈 - n개 중 r개를 뽑아 나열할 때 정수 n과 r이 주어진 경우, 또는 경우의 수의 가짓수를 구해야 하는 경우
# 2) math 모듈을 사용하는 소스코드
import math
nPr = math.perm(3, 2)
nCr = math.comb(3, 2)
print(nPr) # 6
print(nCr) # 3
개인적인 경험을 바탕으로 위와 같이 쓰임새를 구분해보았다.
itertools 모듈을 사용하는 경우 반환값이 객체이므로 경우의 수를 출력하기 위해서는 형 변환이 필요하다.
파이썬에는 리스트를 정렬하는 sort() 메소드와 iterable을 정렬하여 새로운 리스트를 만드는 sorted() 메소드가 있다.
두 내장 함수 모두 key 매개변수를 통해 특정 조건으로 정렬하도록 아래와 같이 지정할 수 있다.
n = int(input())
word = []
for i in range(n):
s = input()
if s not in word:
word.append(s)
word.sort(key=lambda x: (len(x), x))
for w in word:
print(w)
lambda 함수를 작성하는 줄에서 x: (len(x), x) 이렇게 두 가지 인자가 주어지는 것을 볼 수 있는데
첫 번째 인자로 정렬 후 만약 값이 같을 경우, 두 번째 인자로 정렬하도록 조건을 부여하는 것이다.