Skip to content

Commit 9444de2

Browse files
authored
Merge pull request #1920 from wozlsla/main
[wozlsla] Week 10 Solutions
2 parents 6b35a5c + a1613d7 commit 9444de2

File tree

2 files changed

+99
-0
lines changed

2 files changed

+99
-0
lines changed

invert-binary-tree/wozlsla.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
from typing import Optional
2+
3+
4+
class TreeNode:
5+
def __init__(self, val, left=None, right=None):
6+
self.val = val
7+
self.left = left
8+
self.right = right
9+
10+
11+
"""
12+
- L/R 노드의 위치 변경 반복 - 재귀/반복
13+
- 트리 순회: 반복문->BFS(Queue)
14+
1. 큐에 현재 노드 추가
15+
2. 큐에서 노드 꺼냄
16+
3. 꺼낸 노드의 왼쪽<->오른쪽 자식 위치 변경
17+
4. 위치를 바꾼 자식 노드들이 있다면, 다시 큐에 삽입
18+
5. 큐가 빌 때까지 반복
19+
"""
20+
21+
from collections import deque
22+
23+
24+
class Solution:
25+
def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
26+
27+
if not root:
28+
return
29+
30+
que = deque([root])
31+
32+
while que:
33+
node = que.popleft()
34+
35+
# 노드의 왼쪽과 오른쪽 자식 교환
36+
node.left, node.right = node.right, node.left
37+
38+
# 바꾼 자식 노드들이 있으면 큐에 추가 (하나만 있거나 없는 경우 처리)
39+
if node.left:
40+
que.append(node.left)
41+
if node.right:
42+
que.append(node.right)
43+
44+
return root
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
"""
2+
# Intuition
3+
4+
possibly left rotated at an unknown index k → 회전된 배열, 이 조건이 있는 이유?
5+
6+
시간 복잡도 O(logn)
7+
→ 데이터의 크기가 커질수록 처리 시간이 매우 느리게 증가 - 탐색에 자주 사용됨
8+
→ 어떤 알고리즘을 사용해야 하는가?
9+
10+
회전으로 인해 배열 전체가 정렬되어 있지 않지만(두개의 정렬된 배열), O(logn)의 성능을 유지하면서 target을 찾으려면?
11+
12+
13+
# Approach
14+
15+
*회전된 배열 → 중앙값을 기준으로 배열을 나눴을 때, 최소한 한쪽 절반은 정렬되어 있음.
16+
*(예시에서) nums[low](4) < nums[mid](7) 이므로 왼쪽 부분배열은 정렬되어 있음.
17+
18+
N → N/2
19+
1. 어느 쪽이 정렬되어 있는가?
20+
2. target이 그 안에 포함되는가?
21+
"""
22+
23+
from typing import List
24+
25+
26+
class Solution:
27+
def search(self, nums: List[int], target: int) -> int:
28+
29+
low, high = 0, len(nums) - 1
30+
31+
while low <= high:
32+
# mid = low + (high - low) // 2
33+
mid = (low + high) // 2
34+
35+
if nums[mid] == target:
36+
return mid
37+
38+
# 왼쪽이 정렬된 경우
39+
if nums[low] <= nums[mid]:
40+
41+
# target 확인
42+
if nums[low] <= target and target < nums[mid]:
43+
high = mid - 1
44+
else:
45+
low = mid + 1
46+
47+
# 오른쪽이 정렬된 경우 (nums[mid] < nums[high])
48+
else:
49+
50+
if nums[mid] < target and target <= nums[high]:
51+
low = mid + 1
52+
else:
53+
high = mid - 1
54+
55+
return -1

0 commit comments

Comments
 (0)