Study
[묘공단]파이썬 스터디 5주차
A란
2023. 12. 22. 21:58
이 글은 골든래빗 코딩 테스트 합격자 되기 파이썬 편의 9장 써머리입니다.
- 트리
데이터를 탐색하기에 유용한 구조로 계층 구조를 표현하는 용도로 사용.
- 인공지능
- 자동 완성 기능
- 데이터베이스
- 구성요소
- 노드
루트 노드 : 가장 위에 있는 노드
리프 노드 : 자식이 없는 노드
부모 노드 : 상대적으로 위에 있는 노드
자식 노드 : 아리에 있는 노드
- 에지(간선)
노드와 노드사이를 이어주는 선
차수(degree) : 아래로 향하는 간선의 개수
- 표현방법
- 배열로 구현
장점 : 구현 난이도가 쉬워 구현 시간이 단축된다.
단점 : 메모리 공간 낭비.
- 포인터로 구현
장점 : 메모리 공간을 낭비하지 않음.
단점 : 구현 난이도 어려움.
- 이진트리 순회
현재 노드를 부모 노드로 생각했을 때,
- 전위 순회 : 부모 노드 -> 왼쪽 자식 노드 -> 오른쪽 자식 노드
- 중위 순회 : 왼쪽 자식 노드 -> 부모 노드 -> 오른쪽 자식 노드
- 후위 순회 : 왼쪽 자식 노드 -> 오른쪽 자식 노드 -> 부모 노드
- 이진트리 구축
데이터 크기를 따져 크기가 작으면 왼쪽 자식 위치에, 크거나 같으면 오른쪽 자식 위치에 배치.
- 배열 탐색 vs 이진 탐색 트리
이진 탐색 트리가 데이터 크기에 따라 하위 데이터 중 한 방향을 검색 대상에서 제외하므로, 이진 탐색 트리가 훨씬 빠름.
- 시간 복잡도
균형 유지 가정했을 때, O(logN).
균형 유지가 안되었을 때, O(N). 배열과 비슷
** 균형 이진 탐색 트리 : 시간 복잡도 O(logN)
이진 트리의 탐색 연산 횟수가 트리의 높이에 비례 하고 트리의 높이는 logN
1. 양과 늑대 ★
sheep = 0
wolf = 1
#트리 생성
def solution(info, edges):
tree = {}
for edge in edges:
parent, child = edge
if parent not in tree:
tree[parent] = []
if child not in tree:
tree[child] = []
tree[parent].append(child)
tree[child].append(parent) # 양방향 연결, 부모자식 왔다갔다 가능
answer = travel(tree, info, 0, set())
return answer
def travel(tree, info, visit, visited):
global sheep, wolf # 전역 변수로 양과 늑대 표시, 누적 후 최종 반환
visited.add(visit) # 현재 노드를 방문했음을 표시
if info[visit] == 0: # 양이면
sheep += 1
else:
wolf += 1
if wolf >= sheep: #늑대가 많으면 0
return 0
max_sheep = sheep
for new_visit in tree[visit]: # 현재 노드의 자식들에 대해
if new_visit not in visited: #방문 안한 노드면
local_sheep = travel(tree, info, new_visit, visited) # 재귀적으로 양을 모음
max_sheep = max(max_sheep, local_sheep)
return max_sheep