Skip to content

Commit a68c8a4

Browse files
authored
Merge pull request #1614 from yyyyyyyyyKim/main
[yyyyyyyyyKim] WEEK 13 solutions
2 parents f65b0fc + 2d4e1c9 commit a68c8a4

File tree

5 files changed

+146
-0
lines changed

5 files changed

+146
-0
lines changed
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
class MedianFinder:
2+
# Follow up : ๋‘ ๊ฐœ์˜ heap ์‚ฌ์šฉํ•ด์„œ ๊ตฌํ˜„ ๊ฐ€๋Šฅ(์‹œ๊ฐ„๋ณต์žก๋„ O(log n), ์ถ”๊ฐ€ ๊ณต๋ถ€ ํ•„์š”ํ•จ)
3+
# heap ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ด์ง„ ํƒ์ƒ‰ ์‚ฝ์ž…์œผ๋กœ ํ’€์—ˆ์Œ
4+
5+
def __init__(self):
6+
# ์ˆซ์ž ์ €์žฅํ•  ๋ฆฌ์ŠคํŠธ ์ƒ์„ฑ
7+
self.arr = []
8+
9+
10+
def addNum(self, num: int) -> None:
11+
# ์ˆซ์ž ์ถ”๊ฐ€ํ•˜๊ณ  ์ •๋ ฌํ•˜๊ธฐ
12+
# self.arr.append(num)
13+
# self.arr.sort() -> ์‹œ๊ฐ„์ดˆ๊ณผ(์‹œ๊ฐ„๋ณต์žก๋„ O(n log n))
14+
# ์ด์ง„ํƒ์ƒ‰์‚ฝ์ž…(์‹œ๊ฐ„๋ณต์žก๋„ O(n))
15+
bisect.insort(self.arr, num)
16+
17+
def findMedian(self) -> float:
18+
# ๊ธธ์ด๊ฐ€ ํ™€์ˆ˜๋ฉด ๊ฐ€์šด๋ฐ ๊ฐ’ ๋ฆฌํ„ด
19+
if len(self.arr)%2 == 1:
20+
return self.arr[len(self.arr)//2]
21+
# ๊ธธ์ด๊ฐ€ ์ง์ˆ˜๋ฉด ๊ฐ€์šด๋ฐ ๋‘ ์ˆ˜์˜ ํ‰๊ท  ๋ฆฌํ„ด
22+
return (self.arr[len(self.arr)//2-1] + self.arr[len(self.arr)//2]) / 2
23+
24+
# Your MedianFinder object will be instantiated and called as such:
25+
# obj = MedianFinder()
26+
# obj.addNum(num)
27+
# param_2 = obj.findMedian()

โ€Žinsert-interval/yyyyyyyyyKim.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
class Solution:
2+
def insert(self, intervals: List[List[int]], newInterval: List[int]) -> List[List[int]]:
3+
4+
# ์‹œ๊ฐ„๋ณต์žก๋„ O(n log n), ๊ณต๊ฐ„๋ณต์žก๋„ O(n)
5+
6+
# newInterval ์ถ”๊ฐ€ํ•˜๊ณ  ์ •๋ ฌ
7+
intervals.append(newInterval)
8+
intervals.sort()
9+
10+
answer = [intervals[0]]
11+
12+
for i in range(1, len(intervals)):
13+
prev = answer[-1]
14+
curr = intervals[i]
15+
16+
# ๋ณ‘ํ•ฉํ•˜๊ธฐ
17+
# answer์˜ ๋ ๊ฐ’๋ณด๋‹ค ํ˜„์žฌ์˜ ์‹œ์ž‘๊ฐ’์ด ๋” ์ž‘์œผ๋ฉด ๊ฒน์น˜๋Š” ๊ฒƒ -> ํ˜„์žฌ์˜ ๋๊ฐ’๊ณผ answer์˜ ๋๊ฐ’ ์ค‘ ๋” ํฐ ๊ฐ’์œผ๋กœ ๋ณ‘ํ•ฉ
18+
if curr[0] <= prev[1]:
19+
prev[1] = max(prev[1], curr[1])
20+
21+
# ๊ฒน์น˜์ง€ ์•Š์œผ๋ฉด ํ˜„์žฌ๊ฐ’์„ answer์— ์ถ”๊ฐ€
22+
else:
23+
answer.append(curr)
24+
25+
return answer
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
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 kthSmallest(self, root: Optional[TreeNode], k: int) -> int:
9+
10+
# DFS
11+
# ์‹œ๊ฐ„๋ณต์žก๋„ ์ตœ์•… O(n)/ ๊ณต๊ฐ„๋ณต์žก๋„ O(log n) ~ O(n) (์žฌ๊ท€๊นŠ์ด)
12+
self.count = 0
13+
self.answer = None
14+
15+
def dfs(node):
16+
if not node:
17+
return
18+
19+
# ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’๋ถ€ํ„ฐ(์™ผ์ชฝ์„œ๋ธŒํŠธ๋ฆฌ) ์žฌ๊ท€๋กœ ํƒ์ƒ‰
20+
dfs(node.left)
21+
22+
self.count += 1
23+
24+
# k๋ฒˆ์งธ ์ž‘์€ ๊ฐ’ ์ฐพ์œผ๋ฉด ๋ฐ”๋กœ ์ข…๋ฃŒํ•˜๊ธฐ
25+
if self.count == k:
26+
self.answer = node.val
27+
return
28+
29+
# ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ ํƒ์ƒ‰
30+
dfs(node.right)
31+
32+
dfs(root)
33+
34+
return self.answer
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# Definition for a binary tree node.
2+
# class TreeNode:
3+
# def __init__(self, x):
4+
# self.val = x
5+
# self.left = None
6+
# self.right = None
7+
8+
class Solution:
9+
def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
10+
11+
# BST(์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ) ํŠน์„ฑ ํ™œ์šฉํ•ด์„œ ๋ฐธ๋ฅ˜๊ฐ’์œผ๋กœ LCA ์ฐพ๊ธฐ
12+
# ์‹œ๊ฐ„๋ณต์žก๋„ O(log n)/ ์ตœ์•…O(n), ๊ณต๊ฐ„๋ณต์žก๋„ O(1)
13+
while root:
14+
# p, q๊ฐ€ ๋‘˜ ๋‹ค root๋ณด๋‹ค ์ž‘์œผ๋ฉด, LCA๋Š” ์™ผ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์— ์žˆ์Œ
15+
if p.val < root.val and q.val < root.val:
16+
root = root.left
17+
# p, q๊ฐ€ ๋‘˜ ๋‹ค root๋ณด๋‹ค ํฌ๋ฉด, LCA๋Š” ์˜ค๋ฅธ์ชฝ ์„œ๋ธŒํŠธ๋ฆฌ์— ์žˆ์Œ
18+
elif p.val > root.val and q.val > root.val:
19+
root = root.right
20+
# p, q๊ฐ€ root์˜ ์–‘์ชฝ์— ๋‚˜๋ˆ ์ ธ ์žˆ๋Š” ๊ฒฝ์šฐ -> root๊ฐ€ LCA
21+
else:
22+
return root

โ€Žmeeting-rooms/yyyyyyyyyKim.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
from typing import (
2+
List,
3+
)
4+
from lintcode import (
5+
Interval,
6+
)
7+
8+
"""
9+
Definition of Interval:
10+
class Interval(object):
11+
def __init__(self, start, end):
12+
self.start = start
13+
self.end = end
14+
"""
15+
16+
class Solution:
17+
"""
18+
@param intervals: an array of meeting time intervals
19+
@return: if a person could attend all meetings
20+
"""
21+
def can_attend_meetings(self, intervals: List[Interval]) -> bool:
22+
23+
# ์‹œ๊ฐ„๋ณต์žก๋„(O(n^2)), ๊ณต๊ฐ„๋ณต์žก๋„ O(1)
24+
# ์‹œ์ž‘์ ์„ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ(์„ ํƒ์ •๋ ฌ)
25+
for i in range(len(intervals)):
26+
idx = i
27+
for j in range(i+1,len(intervals)):
28+
if intervals[j].start < intervals[idx].start:
29+
idx = j
30+
if idx != i:
31+
intervals[i], intervals[idx] = intervals[idx], intervals[i]
32+
33+
# ๊ฒน์น˜๋Š” ํšŒ์˜ ์žˆ๋Š”์ง€ ํ™•์ธ
34+
for i in range(1, len(intervals)):
35+
if intervals[i].start < intervals[i-1].end:
36+
return False
37+
38+
return True

0 commit comments

Comments
ย (0)