아주 간단하게 배열을 사용해서 푸는 문제로, 원래는 다음과 같이 파이썬으로 for문을 사용해서 풀었다.
# **************************************************************************** #
# #
# ::: :::::::: #
# 3003.py :+: :+: :+: #
# +:+ +:+ +:+ #
# By: jihoolee <jihoolee@student.42SEOUL.kr> +#+ +:+ +#+ #
# +#+#+#+#+#+ +#+ #
# Created: 2022/08/07 17:04:40 by jihoolee #+# #+# #
# Updated: 2022/08/07 17:21:08 by jihoolee ### ########.fr #
# #
# **************************************************************************** #
def main():
DEFAULT_SET = [1, 1, 2, 2, 2, 8]
input_set = list(map(int, input().split()))
for i in range(6):
print(DEFAULT_SET[i] - input_set[i], end=" ")
if __name__ == "__main__":
main()
Python에 내장된 여러 기능들을 사용해서 조금 업그레이드된 코드는 다음과 같다. 결론적으로 코드를 보고, 안에서 사용된 Pythonic한 개념들을 하나하나 정리하자.
# **************************************************************************** #
# #
# ::: :::::::: #
# 3003.py :+: :+: :+: #
# +:+ +:+ +:+ #
# By: jihoolee <jihoolee@student.42SEOUL.kr> +#+ +:+ +#+ #
# +#+#+#+#+#+ +#+ #
# Created: 2022/08/07 17:04:40 by jihoolee #+# #+# #
# Updated: 2022/08/07 17:25:48 by jihoolee ### ########.fr #
# #
# **************************************************************************** #
def main():
DEFAULT_SET = [1, 1, 2, 2, 2, 8]
input_lst = list(map(int, input().split()))
print(*[x - y for x, y in zip(DEFAULT_SET, input_lst)])
if __name__ == "__main__":
main()
zip은 여러 개의 Iterable들을 원소들을 병렬적으로 tuple 형태로 묶어서 iterate할 수 있도록 만들어진 내장 함수이다.
말로 하니까 되게 어려운것처럼 느껴지지만, 코드로 보면 아주 간단하다.
>>> for item in zip([1, 2, 3], ['sugar', 'spice', 'everything nice']):
... print(item)
...
(1, 'sugar')
(2, 'spice')
(3, 'everything nice')
이처럼 zip()은 tuple의 iterator를 반환해주는데, 여기서 n번째의 튜플은 각 iterable의 n번째 원소들을 순서대로 담고 있다.
원래 List같은 자료형은 다른 언어에서 1. 배열을 선언한다, 2. 배열 안의 요소들을 넣어준다. 두 가지 과정을 거치는데,
Python에서는 이 두가지를 한 번에 할 수 있는 문법인 List Comprehension을 제공한다. List Comprehension을 사용할 경우, 코드가 간결해 질 뿐만 아니라, 실제로 속도도 빨라진다!
문법은 다음과 같이 매우 간단하다.
my_list = [ ( 변수를 활용한 값 ) for ( 사용할 변수 이름 ) in ( 순회할 수 있는 값 )]
보기에는 굉장히 활용도가 제한적으로 보이지만, 여러 가지 조건들과 값을 붙이면서 정말 무궁무진한 활용도를 보여준다.
size = 10
arr = [i * 2 for i in range(size)]
print(arr)
#[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
# 방금 만든 arr을 사용
new_arr = [n * n for n in arr]
print(new_arr)
#[0, 4, 16, 36, 64, 100, 144, 196, 256, 324]
word = '가나다'
print([c * 2 for c in word])
#['가가', '나나', '다다']
#조건문 사용
size = 10
arr = [n for n in range(1, 11) if n % 2 == 0]
print(arr)
#[2, 4, 6, 8, 10]
#여러 개의 조건문 사용 (여러개를 사용시 AND로 작용한다)
arr = [n for n in range(1, 31) if n % 2 == 0 if n % 3 == 0]
print(arr)
#[6, 12, 18, 24, 30]