Skip to content

Commit 0c50ee3

Browse files
authored
Merge pull request #1133 from JustHm/main
[JustHm] Week 01 Solutions
2 parents af72b96 + 9290955 commit 0c50ee3

File tree

5 files changed

+133
-0
lines changed

5 files changed

+133
-0
lines changed

contains-duplicate/JustHm.swift

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
class Solution {
2+
func containsDuplicate(_ nums: [Int]) -> Bool {
3+
nums.count != Set(nums).count
4+
}
5+
}

house-robber/JustHm.swift

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
class Solution {
2+
func rob(_ nums: [Int]) -> Int {
3+
guard nums.count != 1 else { return nums[0] }
4+
guard nums.count != 2 else { return max(nums[0], nums[1]) }
5+
6+
// var dp = [nums[0], max(nums[0], nums[1])]
7+
var twoStepPrev = nums[0]
8+
var oneStepPrev = max(nums[0], nums[1])
9+
for i in 2..<nums.count {
10+
var maxNum = max(oneStepPrev, twoStepPrev + nums[i])
11+
twoStepPrev = oneStepPrev
12+
oneStepPrev = maxNum
13+
// var maxNum = max(dp[i-1], dp[i-2] + nums[i])
14+
// dp.append(maxNum)
15+
}
16+
// print(dp)
17+
// return dp.max() ?? 0
18+
return oneStepPrev
19+
}
20+
}
+52
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
class Solution {
2+
func longestConsecutive(_ nums: [Int]) -> Int {
3+
guard !nums.isEmpty else { return 0 }
4+
/*
5+
중복 제거 후 소팅 후 배열로 만드는것은 N + NlogN + N 으로 예상된다..
6+
그래서 정렬만 하고 로직에서 중복 숫자는 그냥 무시하게 만드는 방식으로 속도를 개선
7+
문제에서 O(N)으로 작성하자 라는 제약아닌 제약이 있었는데, O(N)은 도저히 떠오르지 않는다.
8+
*/
9+
let nums = nums.sorted()//Array(Set(nums).sorted())
10+
var answer = 1
11+
var count = 1
12+
for index in 0..<nums.count-1 {
13+
if nums[index] - nums[index + 1] == -1 {
14+
count += 1
15+
}
16+
else if nums[index] == nums[index + 1] { continue }
17+
else {
18+
answer = max(answer, count)
19+
count = 1
20+
}
21+
}
22+
return max(answer, count)
23+
}
24+
}
25+
// MARK: time: O(n) 풀이
26+
/*
27+
몰랐던점 Set의 contains는 O(n) 아님, O(1)임 (내부적으로 Hash table로 구현되어있음)
28+
하지만 풀이 제출해보니까 속도가 sort 한거보다 덜나옴.. 왜?
29+
Set은 contains를 확인할때, 들어온 값을 hash로 변경후 검색, 버킷찾기, 충돌 검사 등을 거치기 때문에... O(1)은 맞는데 시간이 조금 걸린다.
30+
그렇기에 set방식으로 O(n)에 짠거보다 sorted 내장함수를 이용한 O(nlogn)의 실제 실행시간이 더 빠른것.
31+
*/
32+
class AnotherSolution {
33+
func longestConsecutive(_ nums: [Int]) -> Int {
34+
var numSet = Set(nums)
35+
var answer = 0
36+
37+
for num in numSet {
38+
// num-1이 없으면 시작지점이니까 여기부터 +1 하면서 길이 확인
39+
// num-1이 있으면 그냥 무시
40+
if !numSet.contains(num-1) { //Set의 contains는 O(1)임!! (내부적으로 Hash table로 구현되어있기 때문)
41+
var count = 1
42+
var temp = num + 1
43+
while numSet.contains(temp) {
44+
count += 1
45+
temp += 1
46+
}
47+
answer = max(answer, count)
48+
}
49+
}
50+
return answer
51+
}
52+
}

top-k-frequent-elements/JustHm.swift

+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
// MARK: 리뷰를 받고 시도해본 다른 풀이 (time: O(n), space O(n)
2+
class Solution {
3+
func topKFrequent(_ nums: [Int], _ k: Int) -> [Int] {
4+
// 빈도수 별로 Dictionary에 저장
5+
var dict = [Int: Int]()
6+
for num in nums {
7+
dict[num, default: 0] += 1
8+
}
9+
// Bucket sort 사용, 크기는 nums 만큼, 빈도수가 nums 공간보다 클수는 없으니까
10+
var bucket = Array(repeating: [Int](), count: nums.count + 1)
11+
for (key, value) in dict {
12+
// 빈도수를 인덱스로 key == num 을 저장함
13+
// 배열로 한 이유는 빈도수가 같은게 있을 수 있으니까!
14+
bucket[value].append(key)
15+
}
16+
17+
// 결과 출력
18+
var answer = [Int]()
19+
// bucket의 뒤에서부터 탐색
20+
for index in stride(from: nums.count, to: 0, by: -1) {
21+
// 없으면 무시
22+
guard !bucket[index].isEmpty else { continue }
23+
// 버켓의 현재 인덱스에 nil이 아니면 하나씩 결과에 추가해줌.
24+
for item in bucket[index] {
25+
answer.append(item)
26+
// k개 만큼 가져왔다면 바로 리턴
27+
if answer.count == k { return answer }
28+
}
29+
}
30+
31+
return answer
32+
}
33+
}
34+
// MARK: time: O(nlogn), space: O(n)
35+
// n+nlogn+n
36+
class Solution {
37+
func topKFrequent(_ nums: [Int], _ k: Int) -> [Int] {
38+
var dict = [Int: Int]()
39+
for num in nums {
40+
dict[num, default: 0] += 1
41+
}
42+
return [Int](dict.sorted{$0.value > $1.value}.map{$0.key}[..<k])
43+
}
44+
}

two-sum/JustHm.swift

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
class Solution {
2+
func twoSum(_ nums: [Int], _ target: Int) -> [Int] {
3+
var dict = [Int: Int]()
4+
for index in 0..<nums.count {
5+
if let item = dict[nums[index]] {
6+
return [item, index]
7+
}
8+
else { dict[target - nums[index]] = index }
9+
}
10+
return []
11+
}
12+
}

0 commit comments

Comments
 (0)