[Python] 백준 3003번 킹, 퀸, 룩, 비숍, 나이트, 폰 pythonic하게 풀어보기

Jihoon Lee·2022년 8월 7일
1

백준 3003번: 킹, 퀸, 룩, 비숍. 나이트, 폰

아주 간단하게 배열을 사용해서 푸는 문제로, 원래는 다음과 같이 파이썬으로 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을 Python답게

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

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 Comprehension

원래 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]

참고

python 공식 문서

Python 내장 함수 - zip()

블로그

[Python] list comprehension에 대한 즐거운 이해

profile
간단히 기억에 남게 정리해보기

0개의 댓글