File tree Expand file tree Collapse file tree 4 files changed +128
-0
lines changed
longest-consecutive-sequence Expand file tree Collapse file tree 4 files changed +128
-0
lines changed Original file line number Diff line number Diff line change 1+ # 시간 복잡도: O(n)
2+ # - for문 하나로 linear 탐색
3+ # 공간 복잡도: O(n)
4+ # - check_set은 최대 n개만큼 늘어날 수 있음
5+ class Solution :
6+ def containsDuplicate (self , nums : List [int ]) -> bool :
7+ check_set = set ()
8+ for num in nums :
9+ if num in check_set :
10+ # check_set에 이미 있는 경우라면 중복 숫자가 있으므로 True를 return
11+ return True
12+ # check한 숫자는 set에 저장
13+ check_set .add (num )
14+ # for문 모두를 돌았다면 중복 숫자가 없다는 의미이므로 False를 return
15+ return False
Original file line number Diff line number Diff line change 1+ # 시간 복잡도: O(n)
2+ # - dfs(start_i)는 start_i마다 한 번만 계산됨 (memoization하기 때문)
3+ # - 가능한 start_i 상태는 0 ~ n-1 이므로 총 n개
4+ # 공간 복잡도: O(n)
5+ # - memo dictionary가 최대 n개의 결과를 저장
6+ # - 재귀 DFS 호출 스택 깊이가 최대 n
7+ class Solution :
8+ def rob (self , nums : List [int ]) -> int :
9+ houses = len (nums )
10+ memo = {}
11+
12+ def dfs (start_i ):
13+ if start_i in memo :
14+ # memo에 저장된 정보라면 해당 값을 return
15+ return memo [start_i ]
16+
17+ if start_i >= houses :
18+ # start_i가 전체 집 개수(len(nums))를 벗어나면 더이상 계산할 이유가 없으므로 0 return
19+ return 0
20+ else :
21+ # start_i에서 시작해서 계산한 최대 비용은
22+ # start_i + 2에서 시작했을 때의 최대 비용 및 nums[start_i]의 비용의 합과,
23+ # start_i + 1에서 시작했을 때의 최대 비용을
24+ # 비교하여 더 큰 값이 된다.
25+
26+ # 계산한 start_i에서의 최대 비용은 memo에 저장
27+ memo [start_i ] = max (nums [start_i ] + dfs (start_i + 2 ), dfs (start_i + 1 ))
28+ return memo [start_i ]
29+
30+ result = dfs (0 )
31+ return result
Original file line number Diff line number Diff line change 1+ # 시간 복잡도: O(n)
2+ # - while문이 이중으로 쓰였지만, nums에 있는 각 요소를 한 번 씩만 탐색하는 풀이임(이미 확인한 요소는 pop/remove로 없애기 때문)
3+ # 공간 복잡도: O(n)
4+ # - set 하나만 사용했기 때문에 길이인 n개만큼만 공간 차지
5+
6+ class Solution :
7+ def longestConsecutive (self , nums : List [int ]) -> int :
8+ nums = set (nums )
9+ max_length = 1 if nums else 0 # 빈 배열이 들어올 땐 가장 긴 경우는 0밖에 없음
10+
11+ while nums :
12+ num = nums .pop () # 기준이 될 num을 하나 가져옴
13+ length = 1
14+ left , right = 1 , 1
15+ while num - left in nums :
16+ # 기준 num에서 왼쪽으로 확장 가능한 정도를 계산하여 length를 늘림
17+ nums .remove (num - left )
18+ length += 1
19+ left += 1
20+ while num + right in nums :
21+ # 기준 num에서 오른쪽으로 확장 가능한 정도를 계산하여 length를 늘림
22+ nums .remove (num + right )
23+ length += 1
24+ right += 1
25+
26+ max_length = max (max_length , length ) # 기존에 계산해둔 max_length와 비교하여 업데이트
27+
28+ return max_length
29+
30+
31+
32+ # # ** Other trial
33+ # # 시간 복잡도: O(n log n)
34+ # # - sorting을 했기 때문. 문제 통과는 되지만 문제 내 힌트인 O(n)의 시간복잡도를 충족하진 않음
35+ # # 공간 복잡도: O(n)
36+ # # - nums를 set -> list으로 변환하면서 n개의 개수만큼 저장공간 사용
37+ # class Solution:
38+ # def longestConsecutive(self, nums: List[int]) -> int:
39+ # nums = list(set(nums))
40+ # if not nums:
41+ # return 0
42+
43+ # if len(nums) == 1:
44+ # return 1
45+
46+ # nums.sort()
47+ # max_length = 1
48+
49+ # start_i = 0
50+ # length = 1
51+ # while start_i < len(nums) - 1 and start_i + length < len(nums):
52+ # length = 1
53+ # for i in range(start_i, len(nums) - 1):
54+ # if nums[i + 1] == nums[i] + 1:
55+ # length += 1
56+ # else:
57+ # start_i = i + 1
58+ # break
59+ # max_length = max(max_length, length)
60+
61+ # return max_length
Original file line number Diff line number Diff line change 1+ # 시간 복잡도: O(n)
2+ # - nums를 순회하며 dictionary 생성 O(n)
3+ # - nums를 한 번 더 순회하며 target 탐색 O(n)
4+ # 공간 복잡도: O(n)
5+ # - 각 숫자의 index를 저장하는 dictionary idx_map이 최대 n개의 원소를 가짐
6+
7+ class Solution :
8+ def twoSum (self , nums : List [int ], target : int ) -> List [int ]:
9+ # 요소가 어떤 index값을 가지는지 매칭한 dictionary
10+ idx_map = {
11+ el : idx
12+ for idx , el in enumerate (nums )
13+ }
14+
15+ for idx , num in enumerate (nums ):
16+ # target를 만드는, num과 짝이 되는 수를 result_num으로 계산
17+ result_num = target - num
18+ if result_num in idx_map and idx != idx_map [result_num ]:
19+ # 문제의 조건에 맞는 경우에 각 숫자의 index 정보를 early return
20+ # 문제 조건에 무조건 한 가지 경우만 있다고 했기 때문에 early return해도 된다.
21+ return [idx , idx_map [result_num ]]
You can’t perform that action at this time.
0 commit comments