Skip to content

Commit 2f0d644

Browse files
authored
Merge pull request #1864 from sonjh1217/main
[sonjh1217] WEEK 06 solutions
2 parents 50f75bb + e90ae4f commit 2f0d644

File tree

5 files changed

+146
-1
lines changed

5 files changed

+146
-1
lines changed
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
class Solution {
2+
func maxArea(_ height: [Int]) -> Int {
3+
var heights = height
4+
var start = 0
5+
var end = heights.count - 1
6+
var maxAmount = 0
7+
8+
while start < end {
9+
let startHeight = heights[start]
10+
let endHeight = heights[end]
11+
let amount = min(startHeight, endHeight) * (end - start)
12+
maxAmount = max(amount, maxAmount)
13+
14+
if startHeight < endHeight {
15+
start += 1
16+
} else {
17+
end -= 1
18+
}
19+
}
20+
21+
return maxAmount
22+
23+
//시간 O(n)
24+
//공간 O(1)
25+
}
26+
}
27+
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
class WordDictionary {
2+
class TrieNode {
3+
var children: [Character: TrieNode] = [:]
4+
var isEndOfWord = false
5+
}
6+
7+
private var root: TrieNode
8+
9+
init() {
10+
root = TrieNode()
11+
}
12+
13+
// O(n) time / O(n) space
14+
func addWord(_ word: String) {
15+
var node = root
16+
17+
for character in word {
18+
if node.children[character] == nil {
19+
node.children[character] = TrieNode()
20+
}
21+
22+
node = node.children[character]!
23+
}
24+
25+
node.isEndOfWord = true
26+
}
27+
28+
// O(m) ~ O(26^m) time / O(m) space
29+
func search(_ word: String) -> Bool {
30+
return dfs(word: Array(word), index: 0, node: root)
31+
}
32+
33+
private func dfs(word: [Character], index: Int, node: TrieNode) -> Bool {
34+
if index == word.count {
35+
return node.isEndOfWord
36+
}
37+
38+
let character = word[index]
39+
40+
if character == "." {
41+
for child in node.children.values {
42+
if dfs(word: word, index: index + 1, node: child) {
43+
return true
44+
}
45+
}
46+
return false
47+
} else {
48+
guard let child = node.children[character] else {
49+
return false
50+
}
51+
return dfs(word: word, index: index + 1, node: child)
52+
}
53+
}
54+
}
55+

group-anagrams/sonjh1217.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ class Solution {
22
func groupAnagrams(_ strs: [String]) -> [[String]] {
33
var stringsByCount = [[Int]: [String]]()
44

5-
strs.map { str in
5+
strs.forEach { str in
66
var countsByAlphabet = Array(repeating: 0, count: 26)
77
for char in str.unicodeScalars {
88
countsByAlphabet[Int(char.value) - 97] += 1
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
class Solution {
2+
// O(nlogn) time / O(n) space
3+
func lengthOfLIS(_ nums: [Int]) -> Int {
4+
var piles: [Int] = []
5+
// Patience(1인 카드놀이) sort 이용
6+
for num in nums {
7+
let leftInsertion = binarySearch(piles: piles, target: num)
8+
9+
// piles[k] >= x인 pile이 없을 때만 append(길이 증가)
10+
if leftInsertion == piles.count {
11+
piles.append(num)
12+
} else {
13+
//가장 왼쪽의 piles[k] >= x 위치에 교체
14+
piles[leftInsertion] = num
15+
}
16+
17+
}
18+
19+
// piles[k] = 길이 (k+1) 증가수열이 가질 수 있는 '끝값의 최소치'
20+
// sort 로직상 piles.count가 최대한 길게 만들었기 때문에 piles.count는 가장 긴 길이가 됨
21+
return piles.count
22+
}
23+
24+
func binarySearch(piles: [Int], target: Int) -> Int {
25+
var left = 0
26+
27+
//target의 삽입 위치고 맨 끝에 덧붙일수도 있어서 nums.count - 1 이 아님
28+
var right = piles.count
29+
30+
while left < right {
31+
let mid = left + (right - left) / 2
32+
if target > piles[mid] {
33+
left = mid + 1
34+
} else {
35+
//맨 왼쪽 거를 찾아야 함으로 다시 쪼개가면서 맨 왼쪽 거를 찾는다. 맨 왼쪽 거에 넣어야 길이(k) 증가수열의 끝값이 가장 작게 된다. 이래야 최대한 뒤에 계속 더 이어붙여서 최대한 길게 piles를 만들 수 있음.
36+
right = mid
37+
}
38+
}
39+
return left
40+
}
41+
}

valid-parentheses/sonjh1217.swift

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
class Solution {
2+
func isValid (_ s: String) -> Bool {
3+
var brackets: [Character: Character] = ["(": ")", "[": "]", "{": "}"]
4+
var closers = [Character]()
5+
6+
for character in s {
7+
if let closer = brackets[character] {
8+
closers.append(closer)
9+
} else if character == closers.last {
10+
closers.removeLast()
11+
} else {
12+
return false
13+
}
14+
}
15+
16+
return closers.isEmpty
17+
18+
//시간 O(n) (string의 길이)
19+
//공간 O(n)
20+
}
21+
}
22+

0 commit comments

Comments
 (0)