Skip to content

Commit 012933f

Browse files
authored
Merge pull request #1568 from yyyyyyyyyKim/main
[yyyyyyyyyKim] WEEK 11 solutions
2 parents 7a299ac + a2cd9c2 commit 012933f

File tree

5 files changed

+144
-0
lines changed

5 files changed

+144
-0
lines changed
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# Definition for a binary tree node.
2+
# class TreeNode:
3+
# def __init__(self, val=0, left=None, right=None):
4+
# self.val = val
5+
# self.left = left
6+
# self.right = right
7+
class Solution:
8+
def maxPathSum(self, root: Optional[TreeNode]) -> int:
9+
10+
# DFS + 분할정복형 DP
11+
# 시간복잡도 O(n), 공간복잡도 O(n)
12+
self.answer = float('-inf') # 최저값을 초기값으로 세팅(dfs함수에서도 쓰일 수 있게 인스턴스변수 선언해서 전역변수처럼 사용)
13+
14+
def dfs(node):
15+
if not node:
16+
return 0
17+
18+
# 왼쪽, 오른쪽 서브트리에서 최대합(음수라면 버리고 0 가져가기)
19+
left = max(0,dfs(node.left))
20+
right = max(0,dfs(node.right))
21+
22+
# 현재 노드를 포함하는 최대합으로 answer 업데이트
23+
self.answer = max(self.answer, left + right + node.val)
24+
25+
# 왼쪽,오른쪽 중 최대값 선택(한방향이니까)해서 부모에게 리턴
26+
return max(left, right) + node.val
27+
28+
29+
dfs(root)
30+
return self.answer

graph-valid-tree/yyyyyyyyyKim.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
from typing import (
2+
List,
3+
)
4+
5+
class Solution:
6+
"""
7+
@param n: An integer
8+
@param edges: a list of undirected edges
9+
@return: true if it's a valid tree, or false
10+
"""
11+
def valid_tree(self, n: int, edges: List[List[int]]) -> bool:
12+
# DFS(그래프 탐색)
13+
# 시간복잡도 O(n), 공간복잡도 O(n)
14+
15+
# 트리의 간선 수는 항상 "노드 수 -1"(아니면 바로 False)
16+
if len(edges) != n-1:
17+
return False
18+
19+
# 인접 리스트 방식으로 그래프 생성
20+
graph = [[] for _ in range(n)]
21+
for i, j in edges:
22+
graph[i].append(j)
23+
graph[j].append(i)
24+
25+
# set사용(방문여부만 빠르게 탐색(in연산 시간복잡도 O(1))
26+
visited = set()
27+
28+
def dfs(node,prev):
29+
# 이미 방문한 노드면 종료
30+
if node in visited:
31+
return
32+
visited.add(node)
33+
34+
# 현재 노드와 이웃 탐색
35+
for i in graph[node]:
36+
# 바로 이전 노드 패스(무방향 그래프니까)
37+
if i == prev:
38+
continue
39+
dfs(i, node)
40+
41+
42+
# 0번 노드부터 탐색 시작
43+
dfs(0, -1)
44+
45+
# 방문한 노드 수와 전체 노드 수가 같으면 연결 그래프 -> 트리
46+
return len(visited) == n

merge-intervals/yyyyyyyyyKim.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
class Solution:
2+
def merge(self, intervals: List[List[int]]) -> List[List[int]]:
3+
# 시간복잡도 O(n log n), 공간복잡도 O(n)
4+
5+
intervals.sort() # 정렬
6+
answer = []
7+
8+
for i in intervals:
9+
10+
# answer가 비어있거나 answer의 맨 뒤 값이 i의 첫 번째 값보다 작을 경우(겹치지않는경우) answer에 i추가
11+
if not answer or answer[-1][1] < i[0]:
12+
answer.append(i)
13+
14+
# 값이 겹치는 경우 합치기(더 큰 값으로 업데이트)
15+
else:
16+
answer[-1][1] = max(answer[-1][1],i[1])
17+
18+
return answer

missing-number/yyyyyyyyyKim.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
class Solution:
2+
def missingNumber(self, nums: List[int]) -> int:
3+
4+
# 시간복잡도 O(n), 공간복잡도 O(1)
5+
# n = nums의 길이
6+
# 0부터 n까지 총합 = (n*(n+1))//2
7+
# 총합에서 nums의 합을 빼면 빠진 수를 구할 수 있음
8+
return (len(nums)*(len(nums)+1))//2 - sum(nums)

reorder-list/yyyyyyyyyKim.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
# Definition for singly-linked list.
2+
# class ListNode:
3+
# def __init__(self, val=0, next=None):
4+
# self.val = val
5+
# self.next = next
6+
class Solution:
7+
def reorderList(self, head: Optional[ListNode]) -> None:
8+
"""
9+
Do not return anything, modify head in-place instead.
10+
"""
11+
# 시간복잡도 o(n), 공간복잡도 O(1)
12+
13+
# 리스트 중간 지점 찾기
14+
slow, fast = head, head
15+
16+
while fast and fast.next:
17+
slow = slow.next
18+
fast = fast.next.next
19+
20+
# 중간에서 뒷부분 뒤집기
21+
curr = slow.next
22+
prev = None
23+
slow.next = None
24+
25+
while curr:
26+
next_temp = curr.next
27+
curr.next = prev
28+
prev = curr
29+
curr = next_temp
30+
31+
# 앞부분과 뒷부분 합치기
32+
first, second = head, prev
33+
34+
while second:
35+
temp1 = first.next
36+
temp2 = second.next
37+
38+
first.next = second
39+
second.next = temp1
40+
41+
first = temp1
42+
second = temp2

0 commit comments

Comments
 (0)