이번 하반기를 준비하면서 코테의 중요성을 크게 느낀다.
그 동안의 주언어를 자바스크립트를 사용하다가 3주 전부터 급하게 파이썬으로 바꿨다.
자바스크립트를 사용하지않는 기업도 있었고 자바스크립트만 사용하는 기업도 있었지만
가장 큰 이유는 제공하는 라이브러리가 파이썬이 많기 때문에 코테 문제를 풀 때 수월하다는 것이다.
예를 들어 순열, 조합을 계산할 때 자바스크립트는 재귀함수로 함수를 만들어야하지만
파이썬은 라이브러리를 통해 한 줄로 작성가능하다.
코테처럼 시간을 중요시하고 경우의 수를 많이 생각하는 부분에서 당연히 파이썬이 유리할 수 밖에 없다는 나의 판단이다(뇌피셜)
아무튼 학부 때 주언어가 파이썬이었어서 그래도 바꾸는데에 큰 무리는 없었지만 헷갈리기는 했다.
그래서 기본 파이썬 문법들 중 꼭 필요한 것을 여기 정리할 것이다.
( 사실 노션으로 공부를 많이 했는 데 옮겨 정리하는 것 뿐~~~ )
파이선 기본 중요 문법
1. map (lambda)
list(map(**lambda** x,y:x**+**y, in1, in2))
2. reduce
from functools import reduce
target = list(range(1, 21))
print(reduce(lambda x, y: x + y, target))
*# 실행 결과: 210*
- index
- print(a.index(10,2,9)) # index(value, start, end)
📌 람다 (lambda)
기본적 활용
lambda x: int(x)
문자열 변수를 정수형으로 변환.
lambda x,y: x>y
x, y 값을 비교.
lambda x: x['key']
딕셔너리에서 key를 이용해 value를 얻음.
다른 내장함수와의 활용
min, max
# min, max 함수
names = ['Suh', 'Adrian', 'Bill', 'Jonathan']
# longest : 길이가 가장 긴 이름
longest = max(names, key= lambda n: len(n))
print(longest)
# Jonathan
key 를 lambda n: len(n) 로 부여해 가장 길이가 긴 이름을 리턴한다.
sort, filter, map
keys = [{'key': 8}, {'key': 5}, {'key': 9}, {'key': 3}]
# sort 함수
keys.sort(key = lambda x: x['key'])
# [{'key': 3}, {'key': 5}, {'key': 8}, {'key': 9}]
👉 keys 리스트를 내부의 'key' 들의 value를 기준으로 정렬하였다.
# filter 함수
filter(lambda x: x['key']<5, keys)
👉 'key' 들의 value가 5보다 작은 요소들을 가져온다.
# map 함수
map(lambda x: x['key']+5, keys)
👉 모든 'key' 의 value에 5를 더한다.
2. list 원소 삭제
- del 키워드를 통한 삭제
>>> a = [1, 2, 3, 4, 5, 6, 7]
>>>del a[1]
>>> a
[1, 3, 4, 5, 6, 7]
- list의 remove메소드에 의한 삭제
- list.remove(찾을아이템)
- 찾을 아이템이 없으면 ValueError 발생
>>> a = [1, 2, 3, 4, 5, 6, 7]
>>> a.remove(3)
>>> a
[1, 2, 4, 5, 6, 7]
>>> a.remove(9)
Traceback (most recent call last):
File "<stdin>", line 1,in <module>
ValueError: list.remove(x): xnotin list
순열과 조합 with Python
순열
permutation
순열은 순서를 고려하기 때문에 [A, B, C]의 리스트에서 2개의 원소를 골라 순서를 정해 나열하면[(A, B), (A, C), (B, A), (B, C), (C, A), (C, B)] 가 나오게 된다. 즉 순열에서는 (A, B)와 (B, A)는 다른 것이다.
import itertools
arr = ['A', 'B', 'C']
nPr = itertools.permutations(arr, 2)
print(list(nPr))
결과 : [('A', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'C'), ('C', 'A'), ('C', 'B')]
조합
combination
조합은 순서를 고려하지 않기 때문에 [A, B, C]의 리스트에서 2개의 원소를 골라 나열하면[(A, B), (A, C), (B, C)] 가 나오게 된다. 조합은 (A, B)와 (B, A)는 같은 것으로 취급한다.
import itertools
arr = ['A', 'B', 'C']
nCr = itertools.combinations(arr, 2)
print(list(nCr))
결과 : [('A', 'B'), ('A', 'C'), ('B', 'C')]
이외에 유용한 함수
- zip()
- 동일한 개수로 이루어진 iterable한 객체들을 인수로 받아 묶어서 iterator로 반환
z = zip([1, 2, 3], ('A', 'B', 'C')) print(next(z)) # (1, 'A') print(next(z)) # (2, 'B') print(next(z)) # (3, 'C')
- all()
- iterable한 객체를 인수로 받아서 원소가 모두 참이면 True, 아니면 False를 반환
a = all([1, 2, 3]) # True a = all([0, 1, 2]) # False
- any()
- iterable한 객체를 인수로 받아서 원소가 하나라도 참이면 True, 아니면 False를 반환
a = any([0, 1, 2]) # True a = any([0, False, []] # False
- chain()
- iterable한 객체들을 인수로 받아 하나의 iterator로 반환
c1 = [1, 2] ca = ['A', 'B'] c = itertools.chain(c1, ca) print(next(c)) # 1 print(next(c)) # 2 print(next(c)) # A print(next(c)) # B
'Developer > Algorithm' 카테고리의 다른 글
[프로그래머스] 배상 비용 최소화 문제풀이 / Javascript (0) | 2022.09.01 |
---|---|
[프로그래머스] DFS/BFS - 네트워크 (Javascript) (0) | 2022.08.17 |
[프로그래머스] 구현 - 풍선터트리기 (Javascript) (0) | 2022.08.17 |
자바스크립트 - 순열과 조합 (0) | 2022.05.02 |
[프로그래머스] 그래프/BFS - 가장 먼 노드 문제풀이 (Javascript) (0) | 2022.04.30 |