Skip to content

Commit b8b67cf

Browse files
authored
Merge pull request DaleStudy#127 from WhiteHyun/whitehyun/week7
[Hyun] Week 7 Solution Explanation
2 parents f0f8b4d + 8301c33 commit b8b67cf

File tree

5 files changed

+253
-0
lines changed

5 files changed

+253
-0
lines changed
Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
//
2+
// 102. Binary Tree Level Order Traversal
3+
// https://leetcode.com/problems/binary-tree-level-order-traversal/description/
4+
// Dale-Study
5+
//
6+
// Created by WhiteHyun on 2024/06/12.
7+
//
8+
9+
// MARK: - Node
10+
11+
private class Node<T> {
12+
let element: T
13+
var next: Node<T>?
14+
15+
init(element: T, next: Node<T>? = nil) {
16+
self.element = element
17+
self.next = next
18+
}
19+
}
20+
21+
// MARK: - Queue
22+
23+
final class Queue<T> {
24+
private var head: Node<T>?
25+
private var tail: Node<T>?
26+
private var count: Int = 0
27+
28+
var isEmpty: Bool {
29+
count == 0
30+
}
31+
32+
func enqueue(_ element: T) {
33+
let newNode = Node(element: element)
34+
35+
if let tailNode = tail {
36+
tailNode.next = newNode
37+
} else {
38+
head = newNode
39+
}
40+
41+
tail = newNode
42+
count += 1
43+
}
44+
45+
func dequeue() -> T? {
46+
guard let headNode = head
47+
else {
48+
return nil
49+
}
50+
51+
let element = headNode.element
52+
head = headNode.next
53+
54+
if head == nil {
55+
tail = nil
56+
}
57+
58+
count -= 1
59+
return element
60+
}
61+
62+
func peek() -> T? {
63+
head?.element
64+
}
65+
66+
func clear() {
67+
head = nil
68+
tail = nil
69+
count = 0
70+
}
71+
}
72+
73+
// MARK: ExpressibleByArrayLiteral
74+
75+
extension Queue: ExpressibleByArrayLiteral {
76+
convenience init(arrayLiteral elements: T...) {
77+
self.init()
78+
for element in elements {
79+
enqueue(element)
80+
}
81+
}
82+
}
83+
84+
class Solution {
85+
func levelOrder(_ root: TreeNode?) -> [[Int]] {
86+
guard let root else { return [] }
87+
var array: [[Int]] = []
88+
let queue: Queue<(node: TreeNode, layer: Int)> = [(root, 0)]
89+
90+
while let (node, layer) = queue.dequeue() {
91+
// array index 범위에 layer가 들어있지 않으면, 마지막 요소에 빈 배열 추가
92+
if (array.indices ~= layer) == false {
93+
array.append([])
94+
}
95+
array[layer].append(node.val)
96+
97+
if node.left != nil {
98+
queue.enqueue((node.left!, layer + 1))
99+
}
100+
if node.right != nil {
101+
queue.enqueue((node.right!, layer + 1))
102+
}
103+
}
104+
105+
return array
106+
}
107+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
//
2+
// 235. Lowest Common Ancestor of a Binary Search Tree
3+
// https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-search-tree/description/
4+
// Dale-Study
5+
//
6+
// Created by WhiteHyun on 2024/06/12.
7+
//
8+
9+
/**
10+
* Definition for a binary tree node.
11+
* public class TreeNode {
12+
* public var val: Int
13+
* public var left: TreeNode?
14+
* public var right: TreeNode?
15+
* public init(_ val: Int) {
16+
* self.val = val
17+
* self.left = nil
18+
* self.right = nil
19+
* }
20+
* }
21+
*/
22+
23+
class Solution {
24+
func lowestCommonAncestor(_ root: TreeNode?, _ p: TreeNode?, _ q: TreeNode?) -> TreeNode? {
25+
guard let root else { return nil }
26+
if root.val < p!.val, root.val < q!.val {
27+
return lowestCommonAncestor(root.right, p, q)
28+
} else if root.val > p!.val, root.val > q!.val {
29+
return lowestCommonAncestor(root.left, p, q)
30+
}
31+
return root
32+
}
33+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
//
2+
// 19. Remove Nth Node From End of List
3+
// https://leetcode.com/problems/remove-nth-node-from-end-of-list/description/
4+
// Dale-Study
5+
//
6+
// Created by WhiteHyun on 2024/06/10.
7+
//
8+
9+
/**
10+
* Definition for singly-linked list.
11+
* public class ListNode {
12+
* public var val: Int
13+
* public var next: ListNode?
14+
* public init() { self.val = 0; self.next = nil; }
15+
* public init(_ val: Int) { self.val = val; self.next = nil; }
16+
* public init(_ val: Int, _ next: ListNode?) { self.val = val; self.next = next; }
17+
* }
18+
*/
19+
class Solution {
20+
func removeNthFromEnd(_ head: ListNode?, _ n: Int) -> ListNode? {
21+
let answerNode = ListNode(0, head)
22+
var footprintNode = head
23+
24+
for _ in 0 ..< n {
25+
footprintNode = footprintNode?.next
26+
}
27+
28+
var targetNode: ListNode? = answerNode
29+
while footprintNode != nil {
30+
targetNode = targetNode?.next
31+
footprintNode = footprintNode?.next
32+
}
33+
targetNode?.next = targetNode?.next?.next
34+
35+
return answerNode.next
36+
}
37+
}

reorder-list/WhiteHyun.swift

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
//
2+
// 143. Reorder List
3+
// https://leetcode.com/problems/reorder-list/description/
4+
// Dale-Study
5+
//
6+
// Created by WhiteHyun on 2024/06/10.
7+
//
8+
9+
/**
10+
* Definition for singly-linked list.
11+
* public class ListNode {
12+
* public var val: Int
13+
* public var next: ListNode?
14+
* public init() { self.val = 0; self.next = nil; }
15+
* public init(_ val: Int) { self.val = val; self.next = nil; }
16+
* public init(_ val: Int, _ next: ListNode?) { self.val = val; self.next = next; }
17+
* }
18+
*/
19+
class Solution {
20+
func reorderList(_ head: ListNode?) {
21+
guard head?.next != nil else { return }
22+
23+
var nodeList: [ListNode] = []
24+
var tempNode = head
25+
26+
// 1. 각 노드를 선형으로 확인하며 리스트에 추가
27+
while let node = tempNode {
28+
nodeList.append(node)
29+
tempNode = node.next
30+
}
31+
32+
// 2. 각각 next 설정을 snail하게 만듦
33+
for index in 0 ..< nodeList.count >> 1 {
34+
nodeList[nodeList.count - index - 1].next = nodeList[index].next === nodeList[nodeList.count - index - 1] ? nil : nodeList[index].next
35+
nodeList[index].next = nodeList[nodeList.count - index - 1]
36+
}
37+
38+
// 추가. 만약 노드가 홀수라면 가운데 노드의 next를 nil로 설정
39+
if nodeList.count & 1 == 1 {
40+
nodeList[nodeList.count >> 1].next = nil
41+
}
42+
}
43+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
//
2+
// 98. Validate Binary Search Tree
3+
// https://leetcode.com/problems/validate-binary-search-tree/description/
4+
// Dale-Study
5+
//
6+
// Created by WhiteHyun on 2024/06/12.
7+
//
8+
9+
/**
10+
* Definition for a binary tree node.
11+
* public class TreeNode {
12+
* public var val: Int
13+
* public var left: TreeNode?
14+
* public var right: TreeNode?
15+
* public init() { self.val = 0; self.left = nil; self.right = nil; }
16+
* public init(_ val: Int) { self.val = val; self.left = nil; self.right = nil; }
17+
* public init(_ val: Int, _ left: TreeNode?, _ right: TreeNode?) {
18+
* self.val = val
19+
* self.left = left
20+
* self.right = right
21+
* }
22+
* }
23+
*/
24+
class Solution {
25+
private var previousNode: TreeNode?
26+
func isValidBST(_ node: TreeNode?) -> Bool {
27+
guard let node else { return true }
28+
if isValidBST(node.left) == false { return false }
29+
if let previousNode, previousNode.val >= node.val { return false }
30+
previousNode = node
31+
return isValidBST(node.right)
32+
}
33+
}

0 commit comments

Comments
 (0)