파이썬을 파이썬답게 (3)

2019. 9. 14. 22:19개발노트

 

파이썬을 파이썬답게 | 프로그래머스

본 강의는 파이썬 문법을 이미 알고 있는 분들을 대상으로 만들어졌습니다. ##### 이런 분들께 추천합니다 * 파이썬 문법을 알고 계시는 분 * 알고리즘 문제를 조금 더 쉽게 풀고 싶은 분 * Python 코드를 low level 언어( C / C++ ) 코드처럼 짜시는 분 ##### Glossary 본 강의에서 사용하는 파이썬 용어에 익숙하지 않은 분들을 위해, [Python 3.6

programmers.co.kr

1.  2차원 리스트를 1차원 리스트로 만들기

-문자열을 담은 이차원 리스트, mylist 가 solution 함수의 파라미터로 주어집니다. solution 함수가 mylist를 일차원 리스트로 만들어 리턴하도록 코드를 작성해주세요.

파이썬의 sum함수를 사용해서 풀 수 있습니다.

def solution(mylist):
    
    answer = sum(mylist, [])
    return answer

 

이외에도 다양한 방법이 있습니다.

my_list = [[1, 2], [3, 4], [5, 6]]

# 방법 1 - sum 함수
answer = sum(my_list, [])

# 방법 2 - itertools.chain
import itertools
list(itertools.chain.from_iterable(my_list))

# 방법 3 - itertools와 unpacking
import itertools
list(itertools.chain(*my_list))

# 방법4 - list comprehension 이용
[element for array in my_list for element in array]

# 방법 5 - reduce 함수 이용1
from functools import reduce
list(reduce(lambda x, y: x+y, my_list))

# 방법 6 - reduce 함수 이용2
from functools import reduce
import operator
list(reduce(operator.add, my_list))

2. 순열과 조합

-숫자를 담은 일차원 리스트, mylist에 대해 mylist의 원소로 이루어진 모든 순열을 사전 순으로 리턴하는 함수 solution을 완성해주세요.

import itertools
def solution(mylist):
    answer = list(map(list, itertools.permutations(mylist)))
    answer.sort()
    return answer

itertools를 사용해 순열을 쉽게 구할 수 있습니다.

itertools.permutations(mylist) 한 결과를 리스트에 넣으면

[(2, 1), (2, 1)] 처럼 출력됩니다.

문제에서는 [[1, 2], [2, 1]]와 같은 형태를 원하기 때문에

map을 사용해서 형변환하고 sort로 리스트의 순서를 정렬했습니다.


3. 가장 많이 등장하는 알파벳 찾기

-이 문제에는 표준 입력으로 문자열, mystr이 주어집니다. mystr에서 가장 많이 등장하는 알파벳만을 사전 순으로 출력하는 코드를 작성해주세요.

파이썬의 collections.Counter 클래스를 사용하면 이 코드를 간략하게 만들 수 있습니다.

from collections import Counter
my_str = input().strip()
my_str = sorted(my_str)
cnt = Counter(my_str)
cnt= cnt.most_common()
collect = []
for i in range(0, len(cnt)):
    if cnt[i][1] is cnt[0][1]:
        collect.append(cnt[i][0])
print(''.join(collect))   

output은 알파벳 순서대로 나와야 하는 조건이 있어서 sorted함수를 사용했습니다.

문자열 분석을 위해 Counter에 문자열을 넣어주고

most_common 메소드를 사용하면 'aab' 문자열을 다음과 같이 [('a', 2), ('b', 1)] 형태로 나타 낼 수 있습니다.

for 문으로 최대로 나온 문자값과 중복되는 문자를 찾아서 리스트에 넣습니다.


4. for 문과 if문을 한번에

-정수를 담은 리스트 mylist를 입력받아, 이 리스트의 원소 중 짝수인 값만을 제곱해 담은 새 리스트를 리턴하는 solution함수를 완성해주세요. 예를 들어, [3, 2, 6, 7]이 주어진 경우

  • 3은 홀수이므로 무시합니다.
  • 2는 짝수이므로 제곱합니다.
  • 6은 짝수이므로 제곱합니다.
  • 7은 홀수이므로 무시합니다.
def solution(mylist):
    answer = [ i**2 for i in mylist if i %2 == 0]
    return answer

BNF 문법을 사용합니다. 위 코드에서 볼 수 있듯

for 문을 가운데 두고 if문 조건이 성립하면 for문 오른쪽 성립하지 않으면 for문 왼쪽의 식을 적용합니다.

위 코드를 예로 들면,

mylist가 for문을 돌며 i에 들어가고 좌, 우에 if문이 하나씩 있다고 보면 편합니다.

 

*참고

 

6. Expressions — Python 3.7.4 documentation

6. Expressions This chapter explains the meaning of the elements of expressions in Python. Syntax Notes: In this and the following chapters, extended BNF notation will be used to describe syntax, not lexical analysis. When (one alternative of) a syntax rul

docs.python.org


 5. 두 변수의 값 바꾸기 - swap

a = 3
b = 'abc'

temp = a
a = b
b = temp

보통 위 코드처럼 temp 변수를 두고 두 변수의 값을 바꿉니다.

파이썬에서는 간단하게 값을 바꿀 수 있습니다.

a = 3
b = 'abc'

a, b = b, a