코딩테스트를 위한 자료구조 알고리즘

파이썬 문법

테오구 2021. 10. 25. 00:02
728x90

리스트의 인덱싱과 슬라이싱

 

a = [1,2,3,4,5,6

print(a[1:4])

 

리스트 컴프리헨션

1. 리스트를 초기화하는 방법 중 하나

          1. 대괄호 안에 조건문과 반복문을 적용하여 리스트를 초기화 할 수 있습니다.

 

# 0부터 9까지의 수를 포함하는 리스트
array = [i for i in range(10)]

print(array)

 

n = 2
m = 3
array = [[0] * m for _ in range(n)]
print(array)
#[[0,0,0],[0,0,0]]

코딩 테스트에서 잘 사용하는 함수

사전 자료형은 키(key)와 값(value)의 쌍을 데이터로 가지는 자료형

사전 자료형은 키와 값의 쌍을 데이터로 가지며, 원하는 '변경 불가능한(immutable) 자료형'을 키로 사용할 수 있습니다.

 

파이썬의 사전 자료형은 해시 테이블을 이용하므로 데이터의 조회 및 수정에 있어서 O(1)의 시간에 처리할 수 있다.

 

 

# 키 데이터만 담은 리스트
key_list = data.keys()
# 값 데이터만 담은 리스트
value_list = data.values()

 

집합 자료형

집합의 특징

      중복을 허용하지 않는다.

      순서가 없습니다.

집합은 리스트 혹은 문자열을 이용해서 초기화할 수 있습니다.

      이때 set() 함수를 이용합니다.

혹은 중괄호({})안에 각 원소를 콤마(,)를 기준으로 구분하여 삽입함으로써 초기화 할 수 있습니다.

데이터의 조회 및 수정에 있어서 O(1)의 시간에 처리할 수 있습니다.

 

 # 집합 자료형 초기화 방법1
data = set([1, 1, 2, 3, 4, 4, 5])
print(data)
 # 집합 자료형 초기화 방법2
data = {1,1,1,2,3,4,4,5}
print(data)

 

집합 자료형의 연산

 

기본적인 집합 연산으로는 합집합, 교집합, 차집합 연산 등이 있습니다.

     합집합: 집합 A에 속하거나 B에 속하는 원소로 이루어진 집합 (A U B)

     교집합: 집합 A에 속하고 B에 속하는 원소로 이루어진 집합 (A n B)

     차집합: 집합 A의 원소 중에서 B에 속하지 않는 원소들로 이루어진 집합 (A-B)

 

 사전 자료형과 집합 자료형의 특징

 

리스트나 튜플은 순서가 있기 때문에 인덱싱을 통해 자료형의 값을 얻을 수 있습니다.

사전 자료형과 집합 자료형은 순서가 없기 때문에 인덱싱으로 값을 얻을 수 없습니다.

          사전의 키(Key) 혹은 집합의 원소(Element)를 이용해 O(1)의 시간 복잡도를 조회합니다.

 

자주 사용되는 표준 입력 방법

input() 함수는 한 줄의 문자열을 입력 받는 함수 입니다.

map() 함수는 리스트의 모든 원소에 각각 특정한 함수를 적용할 때 사용합니다.

 

예시) 공백을 기준으로 구분된 데이터를 입력 받을 때는 다음과 같이 사용

list(map(int, input().split()))              input을 split으로 나눈값을 int형으로 변환한다

 

a, b, c = map(int, input().split())      입력되는 값이 반드시 3개

 

 

in 연산자와 not in 연산자 설명
x in 리스트 리스트 안에 x가 들어가 있을 때 참이다
x not in 문자열 문자열 안에 x가 들어가 있지 않을 때 참이다.

파이썬의 pass 키워드

아무것도 처리하고 싶지 않을 때 pass 키워드를 사용합니다.

ex) 디버깅 과정에서 일단 조건문의 형태만 만들어 놓고 조건문을 처리하는 부분은 비워놓고 싶은 경우

a = 50

if a >= 30:
pass
else:
print("a < 30")

실전에서 유용한 표준 라이브러리

itertools: 반복되는 형태의 데이터를 처리하기 위한 유용한 기능들을 제공

          특히 순열과 조합 라이브러리는  코딩 테스트에서 자주 사용

heapq: 힙 자료구조를 제공합니다.

          일반적으로 우선순위 큐 기능을 구현하기 위해 사용

bisect: 이진 탐색(Binary Search) 기능을 제공합니다.

collections: 덱(deque), 카운터(Counter) 등의 유용한 자료구조를 포함합니다.

math: 필수적인 수학적 기능을 제공합니다.

          팩토리얼, 제곱근, 최대공약수(GCD), 삼각함수 관련 함수부터 파이(pi)와 같은 상수를 포함합니다.

 

조건문과 반복문

score = 80

if scorce >= 90:
	print("학점: A")
elif scorce >= 80:
	print("학점: B")
elif score >= 70:
	print("학점: C")
else:
	print("학점: F")

https://www.youtube.com/watch?v=m-9pAwq1o3w&list=PLRx0vPvlEmdAghTr5mXQxGpHjWqSz0dgC&ab_channel=%EB%8F%99%EB%B9%88%EB%82%98

 

인덴트

foo = long_function_name(var_one, var_two,
                         var_three, var_four)

이 코드에서처럼 첫 번째 줄에 파라미터가 있다면, 파라미터가 시작되는 부분에 보기 좋게 맞춘다.

 

def long_function_name(
        var_one, var_two, var_three,
        var_four):
    print(var_one)

첫 줄에 파라미터가 없다면 공백 4칸 인덴트를 한번더 추가하여 다른 행과 구분되게 한다.

 

타입 힌트

기존의 타입 힌트를 사용하지 않는 파이썬 함수는 다음과 같이 정의해왔다.

def fn(a):

a가 숫자인지 문자인지를 알 수 없다라는 단점이 있다.

def fn(a: int) -> bool:

이처럼 타입 힌트를 사용하게 되면 함수의 파라미터 a가 정수형임을 분명하게 알 수 있으며 return 값이 True 또는 false를 리턴한다는 것을 알 수 있다.

 

pip install mypy를 하면 타입 힌트에 오류가 없는지 자동으로 확인할 수 있다.

 

타입 힌트가 잘못 지정된 코드는 Incompatible return type 오류가 발생

 

리스트 컴프리헨션

기존의 리스트를 기반으로 새로운 리스트를 만들어내는 구문으로 파이썬2.0부터 지원되었으며 하스켈 같은 함수형 언어에서 기능을 차용해온 파이썬의 대표적인 특징이다.

 

map과  filter를 쓰는 대신 리스트 컴프리헨션을 사용 하자

다음은 홀수인 경우 2를 곱해 출력하라는 리스트 컴프리헨션이다.

[n * 2 for n in range(1, 10 + 1) if n % 2 == 1]
[2, 6, 10, 14, 18]

리스트 컴프리헨션을 사용하지 않을 경우

a = []
for n in range(1, 10+1):
    if n % 2 == 1:
        a.append(n * 2)
        
a
[2, 6, 10, 14, 18]

딕셔너리의 경우도 가능하다

a = {}
for key, value in original.items():
    a[key] = value

이를 다음과 같이 처리한다.

a = {key: value for key, value in orginal.items()}

 

제너레이터

루프의 반복 동작을 제어할 수 있는 루틴 형태

 

가정을 해보면 숫자 1억개를 만들어내 계산하는 프로그램이 있다고 가정하자 이 경우 제너레이터가 없다면 메모리 어딘가에 숫자 1억 개를 보관해야한다. 그러나 제너레이터를 이용하면 생성해두고 필요할 때 언제듵지 숫자를 만들어낼 수 있다.

 

def get_natural_number():
    n = 0
    while True:
        n += 1
        yield n

리턴 값은 다음과 같이 제너레이터가 됩니다.

get_natural_number()
<generator object get_natural_number at 0x10d3139d0>

next()로 추출하면 됩니다.

100개의 값을 생성하고 싶다면 100번동안 next()를 수행하면 됩니다.

g = get_natural_number()
for _ in range(0, 100):
    print(next(g))
...    
1
2
3
...
98
99
100

여러 타입의 값을 하나의 함수에서 생성하는 것도 가능하다.

def generator():
    yield 1
    yield 'string'
    yield True
g = generator()
g
<genertor object generator at 0x10a47c678>
next(g) # 1
next(g) # 'string'
next(g) # True

 

Enumerate

enumerate()는 '열거하다'는 뜻의 함수로 여러 가지 자료형을 인덱스를 포함한 enumerate 객체로 리턴한다.

>>> a = [1, 2, 3, 2, 45, 2, 5]
>>> enumerate(a)
<enumerate object at 0x1010f83f0>
>>> list(enumerate(a))
[(0,1), (1, 2), (2, 3), (3, 2), (4, 45), (5, 2), (6, 5)]

 

a[i] 조회 작업과 길이를 조회하여 루프를 처리하는 형태가 깔끔해 보이지 않는다. 굳이 range()를 사용하지 않고 다음과 같이 구현할 수도 있겠다.

 

i = 0
for v in a:
    print(i, v)
    i += 1

나눗셈 연산자

'/' 5 / 3 = 1.6666666667 float
'//' 5 // 3 = 1 int
'%' 5 % 3 = 2 int

 

코딩 스타일

 

 

728x90

'코딩테스트를 위한 자료구조 알고리즘' 카테고리의 다른 글

삽입 정렬 알고리즘  (0) 2021.10.26
선택 정렬 알고리즘  (0) 2021.10.26
DFS & BFS  (0) 2021.10.25
구현  (0) 2021.10.25
그리디 알고리즘  (0) 2021.10.25