본문 바로가기
Base/Python

18. 이터러블/이터레이터/제너레이터 함수와 표현식 / 가독성 / 유지보수성 / 깊이우선탐색트리 알고리즘 구현 /

by 귀멸 2023. 3. 10.

혼공파 66 ~ 69강

1. 이터러블/이터레이터/제너레이터 함수와 표현식

# for 요소 in 반복할수있는 것
# "이터러블": 반복할수있는 것
# Iterate + able
# 리스트, 튜플, 딕셔너리

# "이터레이터" : 이터러블을 만드는 방법 중 하나
# 이러한 이터레이터는 아래 3가지 방법으로 만들  있다.

# - 1. 제너레이터 표현식 : 메모리를 적게 사용하고 연산이 분산된다.
## 리스트 내포 : 메모리 사용량이 많다
'''[
  표현식
  for 요소 in 반복할수있는것
  if 조건
]'''
범위 = range(1, 100 + 1)
리스트내포 = [
  i * i 
  for i in 범위
]
print(리스트내포)

제너레이터표현식 = (
  i * i
  for i in 범위
)
print(제너레이터표현식) 
# <generator object <genexpr> at 0x7f5d8a4470d0>

## next()함수를 사용해서 이터레이터의 요소들을 하나씩 순차적으로 꺼낼 수 있다.

print(next(제너레이터표현식)) # 1
print(next(제너레이터표현식)) # 4
print(next(제너레이터표현식)) # 9

for 요소 in 제너레이터표현식:
  print(요소)

# 제너레이터표현식은 이터러블이므로 이렇게 반복문에 이터러블로 사용할 수 있다.

# - 2. 제너레이터 함수
# 내부에서 yield 키워드를 사용하는 함수는 제너레이터 함수이다.

def 제너레이터함수():
  for i in range(1, 100+1):
    yield i * i

제너레이터 = 제너레이터함수()
for 요소 in 제너레이터:
  print(요소)

# - 3. 이터레이터 클래스 : 나중에

2. 가독성과 유지보수성

가독성 : 코드를 쉽게 읽고 이해할 수 있는 성질

유지보수 : 코드의 가독성이 높을수록 유지보수성이 올라간다.

  1. 현대의 프로그래밍은 가독성을 높이기위해 주석 보다는 함수를 많이 사용하여 기능을 쪼개고, 
    변수와 함수 이름을 적절하게 지정함으로 가독성을 높인다.
  2. 현대의 컴파일러는 최적화를 통해 간단한 함수는 별도의 메모리 스택 사용없이
    인라인 코드로 불러와서 실행하기 때문에 함수를 최대한 많이 만들어서
    가독성을 높여도 프로그램 성능에 지장을 주지 않도록 한다.
  3. 함수를 사용하면 유지보수 단계의 변경점을 쉽게 전체 프로그램에 반영할 수 있다.

3. 깊이우선탐색트리

# 알고리즘 연습 문제
# 100명의 사람이 하나 이상의 테이블에 나누어 앉는 모든 패턴을 구하라
# 한 개의 테이블에 앉을 수 있는 최대 사람 수는 10명이다.
# 한 개의 테이블에 누구도 혼자 앉아서는 안된다. 최소 2인

## 깊이 우선 탐색 트리
# 전체 사람수를 6명으로 제한해서 생각해 보기
전체사람수 = 6
counter = 0

def 그래프(노드, 이전화살표에적힌숫자):
  if 노드 == 0:
    global counter
    counter += 1
  print(f"{노드}에 진입")
  for i in range(max(2, 이전화살표에적힌숫자), min(노드, 10) + 1):
    print(f"{i} 화살표를 만듦")
    그래프(노드 - i, i)
  print(f"{노드}에서 리턴")
그래프(전체사람수, 0)
print(counter)

0명으로 딱 떨어져서 답이 될 수 있는 경우가 아래의 그림처럼 5가지이지만

테이블 번호와 사람을 구분하지 않으므로 4명 2명 과 2명 4명 테이블은 동일한 방법이 되어 하나만 카운트해야한다.

더 큰 숫자를 앉힌 경우는 다음 진행해서 이전에 앉힌 숫자보다 무조건 큰 경우만 따질 수 있게 하면 중복을 제거할 수 있다. (4명 앉히고서는 2명 앉히는 경우는 진행이 안됨, 따라서 2명 앉히고 4명 앉혀서 0명은 떨어진 부분만 카운트된다)


4. 깊이우선탐색트리 재귀함수에 메모화 적용으로 인한 개선

# 알고리즘 연습 문제
# 100명의 사람이 하나 이상의 테이블에 나누어 앉는 모든 패턴을 구하라
# 한 개의 테이블에 앉을 수 있는 최대 사람 수는 10명이다.
# 한 개의 테이블에 누구도 혼자 앉아서는 안된다. 최소 2인

## 깊이 우선 탐색 트리
전체사람수 = 100
메모 = {
  # 키 : 값
  # 함수의 매개변수 : 리턴
}

def 그래프(노드, 이전화살표에적힌숫자):
  # 튜플 : 이뮤터블 자료형 -> 딕셔너리 키로 사용가능
  # 메모 [(노드, 이전화살표에적힌숫자)]
  if (노드, 이전화살표에적힌숫자) in 메모:
    return 메모[(노드, 이전화살표에적힌숫자)]

  # 일반적인 상황
  리턴값 = 0
  if 노드 == 0:
    리턴값 += 1
  else:
    for i in range(max(2, 이전화살표에적힌숫자), min(노드, 10) + 1):
      리턴값 += 그래프(노드 - i, i)
  return 리턴값
      
print(그래프(전체사람수, 0)) # 437420

 

후오.. 어렵다...

댓글