2 분 소요

Enumerate 함수

  • enumerate 함수는 순서가 있는 자료형 (list, set, tuple, dictionary, string)을 입력으로 받아 인덱스 값을 포함하는 enumerate 객체를 돌려 줌
  • for문과 함께 사용하면 자료형의 현재 순서(index)와 그 값을 쉽게 알 수 있음

l = list(enumerate(input()))
k = []
for j, i in l:
    k.append(i)

print(k)

image

# 응용
graph = []
for _ in range(4):
    cnt = list(enumerate(input()))
    content = []
    for index, data in cnt:
        content.append(int(data))
    
    graph.append(content)

print(graph)

image

이진 탐색 구현을 도와주는 bisect 라이브러리

  • bisect 라이브러리는 원소들이 정렬된 리스트에서 특정 원소를 찾을 때 효과적임.
  • bisect_left(list, targetdata): 리스트에 데이터를 삽입할 가장 왼쪽 인덱스를 찾는 함수(리스트 내 정렬 순서를 유지)
  • bisect_right(list, targetdata): 리스트에 데이터를 삽입 할 가장 오른쪽 인덱스를 찾는 함수(리스트 내 정렬 순서를 유지)
from bisect import bisect_left, bisect_right

a = [1, 2, 3, 3, 5, 10]
x = 3
print(f"bisect_left : {bisect_left(a, x)}") # 2
print(f"bisect_right : {bisect_right(a, x)}") # 4

bisect_left, bisect_right를 응용하여 원소들이 정렬된 리스트에서 특정 범위 내에 속하는 특정 값의 개수를 구할 때 효과적이며 O(logN)으로 빠르게 계산할 수 있음

from bisect import bisect_left, bisect_right

# [left_v, right_v] 범위 내에 있는 원소 개수 출력 함수
def cnt_within_range (arr, left_v, right_v):
    # 맨 좌측 인덱스
    left_idx = bisect_left(arr, left_v)
    # 맨 우측 인덱스
    right_idx = bisect_right(arr, right_v)
    return right_idx - left_idx

# 리스트 생성
arr = [5, 6, 7, 7, 7, 7, 8, 8, 9, 10]

# 값이 9인 원소 개수 출력
print(cnt_within_range(arr, 9, 9)) # 1
# [4, 7] 범위 내에 있는 원소 개수 출력
print(cnt_within_range(arr, 4, 7)) # 6

참조블로그




join함수 🚀

  • 매개변수로 들어온 리스트에 있는 요소 하나하나를 합쳐서 하나의 문자열로 바꾸어 변환하는 함수이다.

  • 함수의 모양은 ‘구분자’.join(리스트)

  • ’‘.join([‘a’,’b’,’c’]) 결과는 ‘abc’ 문자열




순열(permutations)

  • 순열은 순서를 고려하여 뽑는 경우의 수다.

image

nPr

  • 서로 다른 n개에서 r개를 택하여 일렬로 나열하는 경우의 수
  • n!/(n-r)! = nx(n-1)x(n-2)x…x(n-r+1)

예시) 1, 2, 3, 4, 5가 적혀 있는 숫자 카드가 있다. 이를 이용해 세 자리 수를 만들 수 있는 방법은?

  • 백은 자리에 올 수 있는 경우의 수 : 5
  • 십의 자리에 올 수 있는 경우의 수 : 4
  • 일의 자리에 올 수 있는 경우의 수 : 3

따라서 경우의수는 60이다.

itertools 라이브러리에서 permutations함수를 활용한 순열 구현 📃


from itertools import permutations

sets = [1,2,3]

data = itertools.permutation(sets, 2)

for i in data:
   print(i)

#print
(1, 2)
(1, 3)
(2, 1)
(2, 3)
(3, 1)
(3, 2)



조합(combination) 🚀

  • 조합은 순서를 생각하지 않고 뽑는 경우의 수

image

nCr

  • 서로 다른 n개에서 순서를 생각하지 않고 r개를 택하는 경우의 수
  • n!/(n-r)!r! = nPr/r! = {n(n-1)(n-2)…(n-r+1)}r!

예시) A,B,C,D,E 5명의 후보가 있다. 이 중 2명의 대표를 뽑는 방법은?

(A,B),(A,C),(A,D),(A,E) (B,C),(B,D),(B,E) (C,D),(C,E) (D,E)

조합은 순서를 생각하지 않으므로 (A,B)와 (B,A)를 같은 것으로 본다. 즉, 순열은 5P2 = 5x4 = 20이지만 조합은 (5x5)/2 = 10 이다.

5C2 = 5P2/(2x1) = (5x4)/(2x1) = 10

itertools 라이브러리에서 combinations함수를 활용한 순열 구현 📃


from itertools import combinations

sets = ['A', 'B', 'C']

data = itertools.combinations(sets, 2)

for i in data:
   print(i)

#print
(A, B)
(A, C)
(B, C)

태그:

카테고리:

업데이트:

댓글남기기