File tree Expand file tree Collapse file tree 6 files changed +141
-0
lines changed Expand file tree Collapse file tree 6 files changed +141
-0
lines changed Original file line number Diff line number Diff line change
1
+ # DFS + 백트래킹
2
+ # 중복 조합 문제
3
+ # O(2^t) time, O(재귀 깊이 (t) + 결과 조합의 수 (len(result))) space
4
+
5
+ class Solution :
6
+ def combinationSum (self , candidates : List [int ], target : int ) -> List [List [int ]]:
7
+ nums , result = [], []
8
+ def dfs (start , total ):
9
+ if total > target :
10
+ return
11
+ if total == target :
12
+ result .append (nums [:])
13
+ for i in range (start , len (candidates )):
14
+ num = candidates [i ]
15
+ nums .append (num )
16
+ dfs (i , total + num )
17
+ nums .pop ()
18
+
19
+ dfs (0 , 0 )
20
+ return result
Original file line number Diff line number Diff line change
1
+ # 디코드 가능 1 ~ 26
2
+ # 숫자의 첫 번째 자리가 0이라면 decode x
3
+ # O(n) time, O(n) space
4
+
5
+ class Solution :
6
+ def numDecodings (self , s : str ) -> int :
7
+ memo = {len (s ): 1 } # 문자열 끝에 도달했을 때는 경우의 수 1
8
+
9
+ def dfs (start ):
10
+ if start in memo : # 이미 계산한 위치 재계산 x
11
+ return memo [start ]
12
+ if s [start ] == "0" :
13
+ memo [start ] = 0
14
+ elif start + 1 < len (s ) and int (s [start :start + 2 ]) < 27 : # 두 자리로 해석 가능할 때
15
+ memo [start ] = dfs (start + 1 ) + dfs (start + 2 ) # 첫 한 자리만 decode 경우 + 두 자리 한꺼번에 decode 경우
16
+ else :
17
+ memo [start ] = dfs (start + 1 ) # 두 자리로 decode 불가능할 때 -> 한 자리만 decode
18
+ return memo [start ]
19
+ return dfs (0 )
Original file line number Diff line number Diff line change
1
+ # 최대 부분 배열 합 문제
2
+
3
+ # O(n^2) time, O(1) space
4
+ # Time Limit Exceeded
5
+
6
+ class Solution :
7
+ def maxSubArray (self , nums : List [int ]) -> int :
8
+ max_total = nums [0 ]
9
+ for i in range (len (nums )):
10
+ total = 0
11
+ for j in range (i , len (nums )):
12
+ total += nums [j ]
13
+ max_total = max (total , max_total )
14
+ return max_total
15
+
16
+ # 개선 풀이
17
+ # O(n) time, O(1) space
18
+ class Solution :
19
+ def maxSubArray (self , nums : List [int ]) -> int :
20
+ max_total = nums [0 ]
21
+ total = nums [0 ]
22
+ for i in range (1 , len (nums )):
23
+ total = max (nums [i ], total + nums [i ])
24
+ max_total = max (total , max_total )
25
+ return max_total
26
+
27
+ # DP 풀이
28
+ # O(n) time, O(n) space
29
+ class Solution :
30
+ def maxSubArray (self , nums : List [int ]) -> int :
31
+ dp = [0 ] * len (nums )
32
+ dp [0 ] = nums [0 ]
33
+ for i in range (1 , len (nums )):
34
+ dp [i ] = max (nums [i ], dp [i - 1 ] + nums [i ])
35
+ return max (dp )
Original file line number Diff line number Diff line change
1
+ # O(log n) time, O(1) space
2
+ # % 나머지, // 몫
3
+
4
+ class Solution :
5
+ def hammingWeight (self , n : int ) -> int :
6
+ cnt = 0
7
+
8
+ while n > 0 :
9
+ if (n % 2 ) == 1 :
10
+ cnt += 1
11
+ n //= 2
12
+
13
+ return cnt
14
+
15
+
16
+ # O(log n) time, O(log n) space
17
+ class Solution :
18
+ def hammingWeight (self , n : int ) -> int :
19
+ return bin (n ).count ("1" )
20
+
21
+
22
+ # TS 풀이
23
+ # O(log n) time, O(log n) space
24
+ # function hammingWeight(n: number): number {
25
+ # return n.toString(2).split('').filter(bit => bit === '1').length;
26
+ # };
Original file line number Diff line number Diff line change
1
+ # O(n) time, O(1) space
2
+ # isalnum() -> 문자열이 영어, 한글 혹은 숫자로 되어있으면 참 리턴, 아니면 거짓 리턴.
3
+
4
+ class Solution :
5
+ def isPalindrome (self , s : str ) -> bool :
6
+ l = 0
7
+ r = len (s ) - 1
8
+
9
+ while l < r :
10
+ if not s [l ].isalnum ():
11
+ l += 1
12
+ elif not s [r ].isalnum ():
13
+ r -= 1
14
+ elif s [l ].lower () == s [r ].lower ():
15
+ l += 1
16
+ r -= 1
17
+ else :
18
+ return False
19
+ return True
20
+
Original file line number Diff line number Diff line change
1
+ // O(n) time, O(1) space
2
+
3
+ function isPalindrome ( s : string ) : boolean {
4
+ let low = 0 ,
5
+ high = s . length - 1 ;
6
+
7
+ while ( low < high ) {
8
+ while ( low < high && ! s [ low ] . match ( / [ 0 - 9 a - z A - Z ] / ) ) {
9
+ low ++ ;
10
+ }
11
+ while ( low < high && ! s [ high ] . match ( / [ 0 - 9 a - z A - Z ] / ) ) {
12
+ high -- ;
13
+ }
14
+ if ( s [ low ] . toLowerCase ( ) !== s [ high ] . toLowerCase ( ) ) {
15
+ return false ;
16
+ }
17
+ low ++ ;
18
+ high -- ;
19
+ }
20
+ return true ;
21
+ }
You can’t perform that action at this time.
0 commit comments