velopert / velog-client

https://velog.io/
Other
685 stars 131 forks source link

자동 비공개 처리됐습니다. #496

Closed parkjjoe closed 9 months ago

parkjjoe commented 9 months ago

https://velog.io/@parkjjoe/Python-%EC%A3%BC%EC%9A%94-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC

위 글을 작성했는데 자동 비공개 처리 됐어요. 필터링된 단어가 뭔지 잘 모르겠습니다.ㅠㅠ 작성한 내용은 아래와 같아요.

참고한 책
이것이 취업을 위한 코딩 테스트다 with 파이썬


코딩 테스트를 준비하여 반드시 알아야 하는 라이브러리는 아래의 6가지 정도이다.

  • 내장 함수: 기본 내장 라이브러리
    기본 입출력과 정렬 기능이 포함돼 있다.
  • itertools: 반복되는 형태의 데이터를 처리하는 기능을 제공하는 라이브러리
    순열과 조합 라이브러리를 제공한다.
  • heapq: 힙(Heap) 기능을 제공하는 라이브러리
    우선수위 큐 기능을 구현하기 위해 사용한다.
  • bisect: 이진 탐색(Binary Search) 기능을 제공하는 라이브러리
  • collections: 자료구조에 대한 라이브러리
    덱(deque), 카운터(Counter) 등이 포함돼 있다.
  • math: 필수적인 수학적 기능을 제공하는 라이브러리
    팩토리얼, 제곱근, 최대공약수, 삼각함수 관련 함수와 파이(pi) 같은 상수가 포함돼 있다.

내장 함수

별도의 import 없이 바로 사용할 수 있다.

🔴 sum()

리스트 같은 iterable 객체가 주어졌을 때, 모든 원소의 합을 반환한다.

result = sum([1, 2, 3, 4, 5])

print(result) # 15

🟠 min(), max()

min()은 파라미터가 2개 이상 주어졌을 때, min()은 가장 작은 값을 반환하고 max()는 가장 큰 값을 반환한다.

result1 = min(7, 3, 5, 2)
result2 = max(7, 3, 5, 2)

print(result1) # 2
print(result2) # 7

🟡 eval()

수학 수식이 문자열 형식으로 주어지면 해당 수식의 계산 결과를 반환한다.

result = eval("(3 + 5) * 7")
print(result) # 56

🟢 sorted()

Iterable 객체가 주어졌을 때, 정렬 결과를 반환한다. 정렬 기준은 key 속성으로 명시할 수 있다.

result1 = sorted([9, 1, 8, 5, 4]) # 오름차순 정렬
result2 = sorted([9, 1, 8, 5, 4], reverse = True) # 내림차순 정렬

print(result1) # [1, 4, 5, 8, 9]
print(result2) # [9, 8, 5, 4, 1]
result = sorted([('홍길동', 35), ('이순신', 75), ('아무개', 50)], key = lambda x: x[1], reverse  = True)

print(result)  # [('이순신', 75), ('아무개', 50), ('홍길동', 35)]

Iterable 객체는 기본으로 sort()을 내장하고 있어 굳이 sorted()를 사용하지 않고도 sort()로 정렬할 수 있다. 이 경우 리스트 객체의 내부 값이 정렬된 값으로 바로 변경된다.

data = [9, 1, 8, 5, 4]
data.sort()

print(data) # [1, 4, 5, 8, 9]

itertools

반복되는 데이터를 처리하는 기능을 포함하고 있는 라이브러리다.

🔵 permutations

Iterable 객체에서 r개 데이터를 뽑아 일렬로 나열하는 모든 경우(순열)를 계산해준다. 객체 초기화 이후 리스트 자료형으로 변환하여 사용한다.

from itertools import permutations

data = ['A', 'B', 'C']
result = list(permutations(data, 3)) # r = 3인 순열

print(result) # [('A', 'B', 'C'), ('A', 'C', 'B'), ('B', 'A', 'C'), ('B', 'C', 'A'), ('C', 'A', 'B'), ('C', 'B', 'A')]

🟣 combinations

Iterable 객체에서 r개 데이터를 뽑아 순서 없이 나열하는 모든 경우(조합)를 계산한다. 객체 초기화 이후 리스트 자료형으로 변환하여 사용한다.

from itertools iimport combinations

data = ['A', 'B', 'C']
result = list(combinations(data, 2)) # r = 2인 조합

print(result) # [('A', 'B'), ('A', 'C'), ('B', 'C')]

🟤 product

Iterable 객체에서 r개 데이터를 뽑아 일렬로 나열하는 모든 경우(순열)를 계산하나, 중복을 허용한다. product 객체를 초기화할 때는 뽑고자 하는 데이터의 수를 repeat 속성값으로 넣어준다. 객체 초기화 이후에는 리스트 자료형으로 변환하여 사용한다.

from itertools import product

data = ['A', 'B', 'C']
result = list(product(data, repeat=2)) # r = 2인 순열, 중복 허용

print(result) # [('A', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'B'), ('B', 'C'), ('C', 'A'), ('C', 'B'), ('C', 'C')]

 combinations_with_replacement

Iterable 객체에서 r개 데이터를 뽑아 순서 없이 나열하는 모든 경우(조합)를 계산하나, 중복을 허용한다. 객체 초기화 이후에는 리스트를 자료형으로 변환하여 사용한다.

from itertools import combinations_with_replacement

data = ['A', 'B', 'C']
result = list(combinations_with_replacement(data, 2)) # r = 2인 조합, 중복 허용

print(result) # [('A', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'B'), ('B', 'C'), ('C', 'C')]

heapq

힙 기능을 위한 라이브러리다. 다익스트라 최단 경로 알고리즘이나 우선순위 큐 기능을 구현하고자 할 때 사용된다. PriorityQueue 라이브러리를 사용할 수 있지만, 보통 heapq이 더 빠르다.
힙은 최소 힙으로 구성되어 있으므로 단순히 원소를 힙에 전부 넣었다가 빼는 것만으로도 에 오름차순 정렬이 완료된다. 보통 최소 힙 자료구조의 최상단 원소는 항상 가장 작은 원소이기 때문이다.

힙에 원소를 삽입할 때는 heapq.heappush()를, 원소를 꺼내고자 할 때는 heapq.heappop()을 이용한다.

import heapq

def heapsort(iterable):
    h = []
    result = []
    # 모든 원소를 차례대로 힙에 삽입
    for value in iterable:
        heapq.heappush(h, value)
    # 힙에 삽입된 모든 원소를 차례대로 꺼내어 담기
    for _ in range(len(h)):
        result.append(heapq.heappop(h)]
    return result

result = heapsort([1, 3, 5, 7, 9, 2, 4, 6, 8, 0])

print(result) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

heapq 라이브러리를 이용하여 최대 힙을 구현하려면 원소의 부호를 임시로 변경하는 방식을 사용한다.

import heapq

def heapsort(iterable):
    h = []
    result = []
    # 모든 원소를 차례대로 힙에 삽입
    for value in iterable:
        heapq.heappush(h, -value)
    # 힙에 삽입된 모든 원소를 차례대로 꺼내어 담기
    for _ in range(len(h)):
        result.append(-heapq.heappop(h))
    return result

result = heapsort([1, 3, 5, 7, 9, 0, 2, 4, 6, 8])

print(result) # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

bisect

이진 탐색을 쉽게 구현할 수 있게 해 준다. 정렬된 배열에서 특정 원소를 찾아야 할 때 효과적으로 사용된다. 중요하게 사용되는 아래 두 함수는 에 동작한다.

  • bisect_left(a, x): 정렬 순서를 유지하면서 리스트 a에 데이터 x를 삽입할 가장 왼쪽 인덱스를 찾는다.
  • bisect_right(a, x): 정렬 순서를 유지하면서 리스트 a에 데이터 x를 삽입할 가장 오른쪽 인덱스를 찾는다.

예를 들어, 정렬된 리스트 [1, 2, 4, 4, 8]이 있을 때, 새롭게 데이터 4를 삽입하려 한다고 가정하면, 소스코드는 아래와 같다.

from bisect import bisect_left, bisect_right

a = [1, 2, 4, 4, 8]
x = 4

print(bisect_left(a, x)) # 2
print(bisect_right(a, x)) # 4

또한 정렬된 리스트에서 값이 특정 범위에 속하는 원소의 개수를 구할 때도 효과적으로 사용된다.
아래 count_by_range()함수는 정렬된 리스트에서 값이 [left_value, right_value]에 속하는 데이터의 개수를 반환한다. 즉, 원소의 값이 x일 때, left_value ≤ x ≤ right_value인 원소의 개수를 으로 계산한다.

from bisect import bisect_left, bisect_right

# 값이 [left_value, right_value]인 데이터의 개수를 반환
def count_by_range(a, left_value, right_value):
    right_index = bisect_right(a, right_value)
    left_index = bisect_left(a, left_value)
    return right_index - left_index

a = [1, 2, 3, 3, 3, 3, 4, 4, 8, 9]

# 값이 4인 데이터 개수 출력
print(count_by_range(a, 4, 4)) # 2

# 값이 [-1, 3] 범위에 있는 데이터 개수 출력
print(count_by_range(a, -1, 3)) # 6

collections

유용한 자료구조를 제공하는 표준 라이브러리다.

 deque

deque를 이용해 큐를 구현한다. 기본 리스트 자료형에서 append() pop()으로 데이터를 삽입, 삭제할 때 가장 뒤쪽 원소를 기준으로 수행된다. 리스트에서 앞쪽에 원소를 삽입하거나 삭제할 때의 시간 복잡도는 이다. deque와 시간 복잡도를 비교하면 아래와 같다.

설명 | 리스트 | deque -- | -- | -- 가장 앞쪽에 원소 추가 | O(N) | O(1) 가장 뒤쪽에 원소 추가 | O(1) | O(1) 가장 앞쪽에 있는 원소 제거 | O(N) | O(1) 가장 뒤쪽에 있는 원소 제거 | O(1) | O(1)

단, deque는 인덱싱, 슬라이싱 등을 사용할 수 없다. deque는 스택이나 큐의 기능을 모두 포함한다고 볼 수 있기 때문에 스택이나 큐 자료구조의 대용으로 사용될 수 있다.

deque에서 첫 번째 인덱스에 원소 x를 삽입하려면 appendleft(x)를, 마지막 인덱스에 삽입하려면 append(x)를 사용한다. 첫 번째 원소를 제거할 때는 popleft()를, 마지막 원소를 제거할 때는 pop()을 사용한다.
deque를 큐 자료구조로 이용할 때, 삽입에는 append()를, 제거에는 popleft()를 사용하면 된다.

from collections import deque

data = deque([2, 3, 4])
data.appendleft(1)
data.append(5)

print(data) # deque([1, 2, 3, 4, 5])
print(list(data) # [1, 2, 3, 4, 5]

🟥 Counter

등장 횟수를 세는 기능을 제공한다. Iterable 객체가 주어졌을 때, 해당 객체 내부의 원소가 몇 번씩 등장했는지를 알려준다.

from collections import Counter

counter = Counter(['red', 'blue', 'red', 'green', 'blue', 'blue'])

print(counter['blue']) # 3
print(counter['green']) # 1
print(dict(counter)) # ('red': 2, 'blue': 3, 'green': 1)

math

수학 계산을 요구하는 문제에서 효과적으로 사용할 수 있다.

🟧 factorial(x)

x! 값을 반환한다.

import math

print(math.factorial(5)) # 120

🟧 sqrt(x)

x의 제곱근을 반환한다.

import math

print(math.sqrt(7)) # 2.6457513110645907

🟨 gcd(a, b)

최대공약수를 구할 수 있다.

import math

print(math.gcd(21, 14)) # 7

🟩 pi, e

또한 파이(pi)나 자연상수 e도 제공한다.

import math

print(math.pi) # 3.141592653589793
print(math.e) # 2.718281828459045
winverse commented 9 months ago

불편을 드려 죄송합니다

해당 글은 전체 공개로 변경되었습니다 감사합니다 :)

parkjjoe commented 8 months ago

안녕하세요, 답변 받은 후 공개된 것 확인했습니다. 그런데 제가 최근에 해당 글의 제목과 태그를 수정했는데, 다시 비공개가 되었습니다. 추가된 단어는 '이코테'입니다. 혹시 다시 공개 변경해 주실 수 있으실까요? 번거롭게 해 드려 죄송합니다.

winverse commented 8 months ago

이용에 불편을 드려서 죄송합니다. 해당 게시물은 공개로 다시 변경 드렸습니다.

spam filter 기능은 개선 하도록 내부에서 논의가 진행되고 있습니다.

Velog를 이용해주셔서 감사합니다 :)