Skip to content

Commit aad8f28

Browse files
authored
Merge pull request #1591 from yyyyyyyyyKim/main
[yyyyyyyyyKim] WEEK 12 solutions
2 parents 1a881fe + 1f57522 commit aad8f28

File tree

5 files changed

+179
-0
lines changed

5 files changed

+179
-0
lines changed
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
class Solution:
2+
def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:
3+
4+
# 그리디
5+
# 시간복잡도 O(n log n), 공간복잡도 O(1)
6+
7+
# 시작점 기준 정렬
8+
intervals.sort()
9+
answer = 0 # 제거할 개수
10+
curr_end = intervals[0][1] # 첫 구간 끝나는 지점 초기화
11+
12+
for i in range(1,len(intervals)):
13+
start, end = intervals[i]
14+
15+
# 겹치는 경우(제거)
16+
if start < curr_end:
17+
# 현재 구간 제거
18+
answer += 1
19+
# 더 작은 지점 남기기(겹치는 부분을 줄이기위해)
20+
curr_end = min(curr_end, end)
21+
22+
# 안겹치는 경우(현재 구간을 다음 기준으로 탐색)
23+
else:
24+
curr_end = end
25+
26+
return answer
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
from typing import (
2+
List,
3+
)
4+
5+
class Solution:
6+
"""
7+
@param n: the number of vertices
8+
@param edges: the edges of undirected graph
9+
@return: the number of connected components
10+
"""
11+
def count_components(self, n: int, edges: List[List[int]]) -> int:
12+
13+
# DFS
14+
# 시간 복잡도 O(n + e), 공간복잡도 O(n + e) // n=노드수, e=간선수
15+
# 인접 리스트 방식으로 무방향 그래프 생성
16+
graph = [[] for _ in range(n)]
17+
for i, j in edges:
18+
graph[i].append(j)
19+
graph[j].append(i)
20+
21+
visited = set() # 방문한 노드 저장할 집합
22+
answer = 0 # 연결 요소 개수
23+
24+
# 현재 node와 연결된 모든 노드 방문 처리하는 함수
25+
def dfs(node):
26+
# 이미 방문한 노드라면 dfs 종료
27+
if node in visited:
28+
return
29+
visited.add(node) # node 방문처리
30+
# 연결된 노드들도 탐색
31+
for i in graph[node]:
32+
dfs(i)
33+
34+
# 모든 노드 탐색 후 연결 요소 개수 세기
35+
for i in range(n):
36+
# 방문하지 않은 노드라면 dfs 탐색하고 연결요소(answer) +1
37+
if i not in visited:
38+
dfs(i)
39+
answer += 1
40+
41+
return answer
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
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 removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:
8+
9+
# 투포인터
10+
# 시간복잡도 O(n), 공간복잡도 O(1)
11+
12+
# 더미 노드 사용(head삭제되는경우대비)
13+
dummy = ListNode(0, head)
14+
slow, fast = dummy, dummy
15+
16+
# fast를 n칸 이동(slow와의 간격n으로 유지)
17+
for _ in range(n):
18+
fast = fast.next
19+
20+
# fast가 끝에 도달할때까지 slow와 한 칸씩 이동
21+
while fast.next:
22+
fast = fast.next
23+
slow = slow.next
24+
25+
# slow.next = 삭제대상, 건너뛰고연결(삭제처리)
26+
slow.next = slow.next.next
27+
28+
# 새로운 head 반환
29+
return dummy.next

same-tree/yyyyyyyyyKim.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
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 isSameTree(self, p: Optional[TreeNode], q: Optional[TreeNode]) -> bool:
9+
10+
# DFS
11+
# 시간복잡도 O(n), 공간복잡도 O(n)
12+
def dfs(node1, node2):
13+
# 둘 다 없으면 같은 트리
14+
if not node1 and not node2:
15+
return True
16+
# 둘 중 하나만 없으면 다른 트리
17+
if not node1 or not node2:
18+
return False
19+
# 둘의 값이 다르면 다른 트리
20+
if node1.val != node2.val:
21+
return False
22+
# 좌우서브트리 비교
23+
return dfs(node1.left, node2.left) and dfs(node1.right, node2.right)
24+
25+
return dfs(p, q)
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
# Definition for a binary tree node.
2+
# class TreeNode(object):
3+
# def __init__(self, x):
4+
# self.val = x
5+
# self.left = None
6+
# self.right = None
7+
8+
class Codec:
9+
# DFS
10+
11+
# 이진트리 -> 문자열 변환(직렬화)
12+
# 시간복잡도 O(n), 공간복잡도 O(n)
13+
def serialize(self, root):
14+
"""Encodes a tree to a single string.
15+
16+
:type root: TreeNode
17+
:rtype: str
18+
"""
19+
if not root:
20+
return 'null'
21+
22+
# 재귀 호출로 노드값을 문자열로 저장
23+
return str(root.val) + ',' + self.serialize(root.left) + ',' + self.serialize(root.right)
24+
25+
26+
# 문자열 -> 이진트리 변환(역직렬화)
27+
# 시간복잡도 O(n), 공간복잡도 O(n)
28+
def deserialize(self, data):
29+
"""Decodes your encoded data to tree.
30+
31+
:type data: str
32+
:rtype: TreeNode
33+
"""
34+
# ','를 기준으로 끊어서 리스트로 변환
35+
s = data.split(',')
36+
37+
def dfs():
38+
# 맨 앞부터 꺼내기
39+
val = s.pop(0)
40+
41+
# null이면 자식 노드 없음
42+
if val == 'null':
43+
return None
44+
45+
node = TreeNode(int(val)) # 현재 노드
46+
node.left = dfs() # 왼쪽 서브트리
47+
node.right = dfs() # 오른쪽 서브트리
48+
49+
return node
50+
51+
return dfs()
52+
53+
54+
55+
# Your Codec object will be instantiated and called as such:
56+
# ser = Codec()
57+
# deser = Codec()
58+
# ans = deser.deserialize(ser.serialize(root))

0 commit comments

Comments
 (0)