< 이 글은 책 '이것이 취업을 위한 코딩 테스트다' 에서 발췌한 내용을 인용했습니다. >
꼭 필요한 자료구조 기초
탐색: 많은 양의 데이터 중에서 원하는 데이터를 찾는 과정
--> 대표적인 탐색 알고리즘으로 DFS와 BPS를 꼽을 수 있음. 그러나 이를 제대로 이해하려면 기본 자료구조인 스택과 큐를 알고 있어야함.
자료구조: 데이터를 표현하고 관리하고 처리하기 위한 구조
스택
박스쌓기에 비유할 수 있음. 선입후출(후입선출) 구조.
<스택 예제>
stack = []
# 삽입(5) - 삽입(2) - 삽입(3) - 삽입(7) - 삭제() - 삽입(1) - 삽입(4) - 삭제()
stack.append(5)
stack.append(2)
stack.append(3)
stack.append(7)
stack.pop()
stack.append(1)
stack.append(4)
stack.pop()
print(stack) # 최하단 원소부터 출력
print(stack[::-1]) # 최상단 원소부터 출력
파이썬에서는 스택을 이용할 때 별도의 라이브러리를 사용할 필요가 없다. 기본 리스트에서 append()와 pop() 메서드를 이용하면 스택 자료구조와 동일하게 동작한다.
큐
대기 줄에 비유 가능. 선입선출 구조.
<큐 예제>
from collections import deque
queue = deque()
queue.append(5)
queue.append(2)
queue.append(3)
queue.append(7)
queue.popleft()
queue.append(1)
queue.append(4)
queue.popleft()
print(queue)
queue.reverse()
print(queue)
# deque 객체를 리스트 자료형으로 변경하고자 한다면 list() 메서드를 사용하면됨. ex) list(queue)
파이썬에서 큐를 구현할 때는 collections 모듈에서 제공하는 deque 자료구조를 사용한다.
deque는 스택과 큐의 장점을 모두 채택한 것으로 데이터를 넣고 뺴는 속도가 리스트 자료형에 비해 효율적이며 queue 라이브러리를 쓰는 것보다 더 간단하다. (참고로 대부분의 코딩테스트에서는 collections 모듈과 같은 기본 라이브러리 사용은 허용한다!)
재귀 함수
재귀 함수는 자기 자신을 다시 호출하는 함수를 말한다.
<재귀 함수 예제>
def recursive_fuction():
print('재귀 함수를 호출합니다.')
recursive_fuction()
recursive_fuction()
이 코드는 무한히 실행되기 때문에 어느정도 출력하다가 에러 메시지를 출력하고 멈춘다.
따라서 재귀 함수는 꼭 종료 조건을 명시해야한다.
<재귀 함수의 종료 조건 예제>
def recursive_fuction(i):
if i == 100:
return
print(i, '번째 재귀 함수에서', i + 1, "번째 재귀 함수를 호출합니다.")
recursive_fuction(i+1)
print(i, '번째 재귀 함수를 종료합니다.')
recursive_fuction(1)
컴퓨터 내부에서 재귀 함수의 수행은 스택 자료구조를 이용한다. 따라서 스택 자료구조를 활용해야 하는 상당수 알고리즘은 재귀 함수를 이용해서 간편하게 구현될 수 있다. DFS가 대표적인 예이다.
<2가지 방식으로 구현한 팩토리얼 예제>
#반복적으로 구현한 n!
def factorial_iterative(n):
result = 1
for i in range(1,n+1):
result *= i
return result
#재귀적으로 구현한 n!
def factorial_recursive(n):
if n == 1:
return 1
return n * factorial_recursive(n-1)
print('반복적으로 구현:', factorial_iterative(5))
print('재귀적으로 구현:', factorial_recursive(5))
* 재귀 함수는 반복문을 이용하는 것과 비교했을 때 더욱 간결한 형태임을 알 수 있다.
'이것이 취업을 위한 코딩테스트다 with 파이썬' 카테고리의 다른 글
Chapter 5-3 음료수 얼려 먹기 (0) | 2022.12.21 |
---|---|
Chapter 5-2 탐색 알고리즘 DFS/BFS (0) | 2022.12.20 |
Chapter 4-3 게임 개발 (0) | 2022.12.12 |
Chapter 04-2 왕실의 나이트 (0) | 2022.11.28 |
Chapter 04-1 아이디어를 코드로 바꾸는 구현 (0) | 2022.11.24 |