Skip to content

Commit f552959

Browse files
authored
Merge pull request #1586 from hi-rachel/main
[hi-rachel] Week 11 Solutions
2 parents 936510f + 192433f commit f552959

File tree

4 files changed

+136
-0
lines changed

4 files changed

+136
-0
lines changed
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
"""
2+
- 정점 개수 n, κ°„μ„  λ°°μ—΄ edges
3+
- 무방ν–₯ κ·Έλž˜ν”„
4+
5+
트리 쑰건
6+
1. μ™„μ „νžˆ μ—°κ²°λœ κ·Έλž˜ν”„μ—¬μ•Ό 함 -> 전체 탐색 κ°€λŠ₯
7+
2. κ·Έλž˜ν”„μ— μˆœν™˜ν•˜λŠ” 뢀뢄이 μ—†μ–΄μ•Ό 함
8+
9+
트리 νŠΉμ„±μƒ 항상 e = n - 1, 즉 κ°„μ„ μ˜ 수 = λ…Έλ“œμ˜ 개수 - 1
10+
11+
TC: O(n)
12+
SC: O(n)
13+
"""
14+
15+
from typing import List
16+
17+
class Solution:
18+
def validTree(self, n: int, edges: List[List[int]]) -> bool:
19+
graph = [[] for _ in range(n)]
20+
visited = set()
21+
22+
for a, b in edges:
23+
graph[a].append(b)
24+
graph[b].append(a)
25+
26+
def has_cycle(node, prev):
27+
# 이미 λ°©λ¬Έ = μˆœν™˜ -> 트리 x
28+
if node in visited:
29+
return True
30+
visited.add(node)
31+
for adj in graph[node]:
32+
if adj == prev:
33+
continue
34+
if has_cycle(adj, node):
35+
return True
36+
37+
return False
38+
39+
if has_cycle(0, -1):
40+
return False
41+
42+
return len(visited) == n

β€Žmerge-intervals/hi-rachel.pyβ€Ž

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
"""
2+
https://leetcode.com/problems/merge-intervals/description/
3+
4+
문제 μ„€λͺ…:
5+
- μ£Όμ–΄μ§„ ꡬ간(interval) λ¦¬μŠ€νŠΈμ—μ„œ κ²ΉμΉ˜λŠ” ꡬ간듀을 병합(merge)ν•˜μ—¬ λ°˜ν™˜ν•©λ‹ˆλ‹€.
6+
- 각 ꡬ간은 [start, end] ν˜•νƒœμž…λ‹ˆλ‹€.
7+
- κ²°κ³ΌλŠ” κ²ΉμΉ˜λŠ” ꡬ간이 μ—†λŠ” λ¦¬μŠ€νŠΈμ—¬μ•Ό ν•˜λ©°, μ •λ ¬λœ μˆœμ„œλ‘œ λ°˜ν™˜ν•©λ‹ˆλ‹€.
8+
9+
TC: O(N log N)
10+
- intervalsλ₯Ό μ •λ ¬ν•˜λŠ” 데 O(N log N)
11+
- ν•œ 번의 반볡으둜 병합 처리 β†’ O(N)
12+
13+
SC: O(N)
14+
- κ²°κ³Ό 리슀트(output)에 μ΅œλŒ€ N개의 ꡬ간이 μ €μž₯될 수 있음
15+
"""
16+
17+
from typing import List
18+
19+
class Solution:
20+
def merge(self, intervals: List[List[int]]) -> List[List[int]]:
21+
output = []
22+
for interval in sorted(intervals):
23+
# output이 λΉ„μ–΄μžˆκ±°λ‚˜, ν˜„μž¬ interval이 이전 intervalκ³Ό κ²ΉμΉ˜μ§€ μ•ŠμœΌλ©΄ κ·ΈλŒ€λ‘œ μΆ”κ°€
24+
if not output or output[-1][1] < interval[0]:
25+
output.append(interval)
26+
else:
27+
# κ²ΉμΉ˜λŠ” 경우: λλ‚˜λŠ” 뢀뢄을 더 κΈ΄ μͺ½μœΌλ‘œ 병합
28+
output[-1][1] = max(output[-1][1], interval[1])
29+
30+
return output

β€Žmissing-number/hi-rachel.tsβ€Ž

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
/**
2+
* https://leetcode.com/problems/missing-number/
3+
*
4+
* 문제 μ„€λͺ…:
5+
* - 0λΆ€ν„° nκΉŒμ§€μ˜ 숫자 쀑 ν•˜λ‚˜κ°€ λΉ μ§„ 길이 n의 λ°°μ—΄ numsκ°€ μ£Όμ–΄μ§‘λ‹ˆλ‹€.
6+
* - 이 λ•Œ, λˆ„λ½λœ 숫자 ν•˜λ‚˜λ₯Ό μ°Ύμ•„ λ°˜ν™˜ν•˜μ„Έμš”.
7+
*
8+
* 쑰건:
9+
* - nums.length == n
10+
* - nums의 μš”μ†ŒλŠ” κ³ μœ ν•˜λ©° [0, n] λ²”μœ„μ˜ μ •μˆ˜λ₯Ό ν¬ν•¨ν•©λ‹ˆλ‹€.
11+
*
12+
* 풀이 아이디어:
13+
* - 0λΆ€ν„° nκΉŒμ§€μ˜ 총합을 κ³΅μ‹μœΌλ‘œ κ³„μ‚°ν•œ ν›„, μ‹€μ œ λ°°μ—΄μ˜ 총합을 λΊλ‹ˆλ‹€.
14+
* 0λΆ€ν„° nκΉŒμ§€μ˜ ν•© 곡식:
15+
* 0 + 1 + 2 + ... + n = n(n + 1)/2
16+
* - λΉ μ§„ 숫자 = κΈ°λŒ€ 총합 - μ‹€μ œ 총합
17+
*
18+
* TC: O(n)
19+
* - λ°°μ—΄ 순회둜 μ‹€μ œ 합을 κ΅¬ν•˜λŠ” 데 O(n)
20+
*
21+
* SC: O(1)
22+
* - μΆ”κ°€ 곡간 없이 μƒμˆ˜ λ³€μˆ˜λ§Œ μ‚¬μš©
23+
*/
24+
25+
function missingNumber(nums: number[]): number {
26+
const expectedSum = Math.floor((nums.length * (nums.length + 1)) / 2);
27+
const actualSum = nums.reduce((acc, cur) => acc + cur);
28+
return expectedSum - actualSum;
29+
}

β€Žreorder-list/hi-rachel.pyβ€Ž

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
"""
2+
μŠ€νƒμ— λͺ¨λ“  μ›μ†Œκ°€ μ €μž₯λ˜μ–΄ μžˆλ‹€λ©΄, λ²ˆκ°ˆμ•„ κ°€λ©΄μ„œ, ν•œ λ²ˆμ€ λ§ν¬λ“œ λ¦¬μŠ€νŠΈμ—μ„œ λ…Έλ“œλ₯Ό μ–»κ³ ,
3+
ν•œ λ²ˆμ€ μŠ€νƒμ—μ„œ μ›μ†Œλ₯Ό μ–»λŠ”λ‹€λ©΄, L[0] β†’ L[n - 1] β†’ L[1] β†’ L[n - 2] β†’ L[2] β†’ L[n - 3] β†’ … 순으둜 λ…Έλ“œμ— μ ‘κ·Όν•  수 μžˆμ„ 것
4+
5+
TC: O(n)
6+
SC: O(n)
7+
"""
8+
9+
from typing import Optional
10+
11+
# Definition for singly-linked list.
12+
class ListNode:
13+
def __init__(self, val=0, next=None):
14+
self.val = val
15+
self.next = next
16+
17+
class Solution:
18+
def reorderList(self, head: Optional[ListNode]) -> None:
19+
stack = []
20+
node = head
21+
# μ—°κ²° 리슀트의 λͺ¨λ“  λ…Έλ“œλ₯Ό stack에 μ €μž₯
22+
while node:
23+
stack.append(node)
24+
node = node.next
25+
26+
node = dummy = ListNode(-1)
27+
for i in range(len(stack)):
28+
if i % 2:
29+
node.next = stack.pop() # ν™€μˆ˜ 인덱슀: λ’€μ—μ„œλΆ€ν„° 꺼냄
30+
else:
31+
node.next = head # 짝수 인덱슀: μ•žμ—μ„œλΆ€ν„° κ°€μ Έμ˜΄
32+
head = head.next
33+
node = node.next
34+
node.next = None
35+
return dummy.next

0 commit comments

Comments
Β (0)