File tree 5 files changed +209
-0
lines changed
product-of-array-except-self
validate-binary-search-tree
5 files changed +209
-0
lines changed Original file line number Diff line number Diff line change
1
+ function threeSum ( nums : number [ ] ) : number [ ] [ ] {
2
+ nums . sort ( ( a , b ) => a - b ) ;
3
+ const result : number [ ] [ ] = [ ] ;
4
+ const target = 0 ;
5
+
6
+ for ( let i = 0 ; i < nums . length - 2 ; i ++ ) {
7
+ // 중복된 시작 숫자는 건너뛰기
8
+ if ( i > 0 && nums [ i ] === nums [ i - 1 ] ) continue ;
9
+
10
+ let left = i + 1 ;
11
+ let right = nums . length - 1 ;
12
+
13
+ while ( left < right ) {
14
+ const sum = nums [ i ] + nums [ left ] + nums [ right ] ;
15
+
16
+ if ( sum === target ) {
17
+ result . push ( [ nums [ i ] , nums [ left ] , nums [ right ] ] ) ;
18
+
19
+ // 중복된 left 값 건너뛰기
20
+ while ( left < right && nums [ left ] === nums [ left + 1 ] ) left ++ ;
21
+ // 중복된 right 값 건너뛰기
22
+ while ( left < right && nums [ right ] === nums [ right - 1 ] ) right -- ;
23
+
24
+ // 다음 조합 시도
25
+ left ++ ;
26
+ right -- ;
27
+ } else if ( sum < 0 ) {
28
+ left ++ ;
29
+ } else {
30
+ right -- ;
31
+ }
32
+ }
33
+ }
34
+
35
+ return result ;
36
+ } ;
Original file line number Diff line number Diff line change
1
+ // 1번풀이 (hashMap)
2
+ function climbStairs1 ( n : number ) : number {
3
+ const dp : Record < number , number > = {
4
+ 1 : 1 ,
5
+ 2 : 2 ,
6
+ } ;
7
+
8
+ for ( let i = 3 ; i <= n ; i ++ ) {
9
+ dp [ i ] = dp [ i - 1 ] + dp [ i - 2 ] ;
10
+ }
11
+
12
+ return dp [ n ] ;
13
+ } ;
14
+
15
+ // 2번풀이 (배열)
16
+ function climbStairs2 ( n : number ) : number {
17
+ const dp = [ 0 , 1 , 2 ] ; // dp[1] = 1, dp[2] = 2
18
+
19
+ for ( let i = 3 ; i <= n ; i ++ ) {
20
+ dp [ i ] = dp [ i - 1 ] + dp [ i - 2 ] ;
21
+ }
22
+
23
+ return dp [ n ] ;
24
+ } ;
25
+
26
+ // 3번풀이
27
+ // 불필요한 배열 전체 저장을 제거하고, 필요한 값만 2개만 유지
28
+ function climbStairs ( n : number ) : number {
29
+ if ( n <= 2 ) return n ;
30
+
31
+ let prev1 = 1 ; // dp[i - 2]
32
+ let prev2 = 2 ; // dp[i - 1]
33
+
34
+ for ( let i = 3 ; i <= n ; i ++ ) {
35
+ const current = prev1 + prev2 ;
36
+ prev1 = prev2 ;
37
+ prev2 = current ;
38
+ }
39
+
40
+ return prev2 ;
41
+ } ;
42
+
Original file line number Diff line number Diff line change
1
+ // 1번 풀이
2
+ function productExceptSelf1 ( nums : number [ ] ) : number [ ] {
3
+ const result : number [ ] = new Array ( nums . length ) . fill ( 1 ) ;
4
+
5
+ applyLeftProducts ( nums , result ) ;
6
+ applyRightProducts ( nums , result ) ;
7
+
8
+ return result ;
9
+ } ;
10
+
11
+ function applyLeftProducts ( nums : number [ ] , result : number [ ] ) {
12
+ let prefix = 1 ;
13
+ for ( let i = 0 ; i < nums . length ; i ++ ) {
14
+ result [ i ] = prefix ;
15
+ prefix *= nums [ i ] ;
16
+ }
17
+ } ;
18
+
19
+ function applyRightProducts ( nums : number [ ] , result : number [ ] ) {
20
+ let suffix = 1 ;
21
+ for ( let i = nums . length - 1 ; i >= 0 ; i -- ) {
22
+ result [ i ] *= suffix ;
23
+ suffix *= nums [ i ] ;
24
+ }
25
+ } ;
26
+
27
+ // 2번 풀이
28
+ function productExceptSelf2 ( nums : number [ ] ) : number [ ] {
29
+ const length = nums . length ;
30
+ const result : number [ ] = new Array ( length ) . fill ( 1 ) ;
31
+
32
+ // 1단계: 왼쪽 누적 곱 저장
33
+ let prefix = 1 ;
34
+ for ( let i = 0 ; i < length ; i ++ ) {
35
+ result [ i ] = prefix ;
36
+ prefix *= nums [ i ] ;
37
+ }
38
+
39
+ // 2단계: 오른쪽 누적 곱 곱하기 (in-place)
40
+ let suffix = 1 ;
41
+ for ( let i = length - 1 ; i >= 0 ; i -- ) {
42
+ result [ i ] *= suffix ;
43
+ suffix *= nums [ i ] ;
44
+ }
45
+
46
+ return result ;
47
+ } ;
Original file line number Diff line number Diff line change
1
+ // 1번풀이 (hashTable)
2
+ function isAnagram1 ( s : string , t : string ) : boolean {
3
+ if ( s . length !== t . length ) return false ;
4
+
5
+ const charCount : Record < string , number > = { } ;
6
+
7
+ for ( const char of s ) {
8
+ charCount [ char ] = ( charCount [ char ] ?? 0 ) + 1 ;
9
+ }
10
+
11
+ for ( const char of t ) {
12
+ if ( ! charCount [ char ] ) return false ;
13
+ charCount [ char ] -- ;
14
+ }
15
+
16
+ return true ;
17
+ } ;
18
+
19
+ // 2번풀이 (sort)
20
+ function isAnagram2 ( s : string , t : string ) : boolean {
21
+ if ( s . length !== t . length ) return false ;
22
+
23
+ const sortedS = s . split ( '' ) . sort ( ) . join ( '' ) ;
24
+ const sortedT = t . split ( '' ) . sort ( ) . join ( '' ) ;
25
+
26
+ return sortedS === sortedT ;
27
+ } ;
28
+
Original file line number Diff line number Diff line change
1
+ class TreeNode {
2
+ val : number ;
3
+ left : TreeNode | null ;
4
+ right : TreeNode | null ;
5
+ constructor ( val ?: number , left ?: TreeNode | null , right ?: TreeNode | null ) {
6
+ this . val = val === undefined ? 0 : val ;
7
+ this . left = left === undefined ? null : left ;
8
+ this . right = right === undefined ? null : right ;
9
+ }
10
+ }
11
+
12
+ // 1번풀이
13
+ function isValidBST1 ( root : TreeNode | null ) : boolean {
14
+ const values : number [ ] = [ ] ;
15
+
16
+ // 중위노드 : 왼쪽 자식 -> 부모 노드 -> 오른쪽 자식
17
+ function inorder ( node : TreeNode | null ) {
18
+ if ( ! node ) return null ;
19
+ const { val, left, right } = node ;
20
+
21
+ inorder ( left ) ;
22
+ values . push ( val ) ;
23
+ inorder ( right ) ;
24
+ }
25
+
26
+ inorder ( root ) ;
27
+
28
+ for ( let i = 1 ; i < values . length ; i ++ ) {
29
+ if ( values [ i ] <= values [ i - 1 ] ) return false ;
30
+ }
31
+
32
+ return true ;
33
+ } ;
34
+
35
+ // 2번풀이 (배열 대신 변수 사용)
36
+ function isValidBST2 ( root : TreeNode | null ) : boolean {
37
+ let prev : number | null = null ;
38
+ let isValid = true ;
39
+
40
+ function inorder ( node : TreeNode | null ) {
41
+ if ( ! node || ! isValid ) return ;
42
+
43
+ inorder ( node . left ) ;
44
+
45
+ if ( prev !== null && node . val <= prev ) {
46
+ isValid = false ;
47
+ return ;
48
+ }
49
+ prev = node . val ;
50
+
51
+ inorder ( node . right ) ;
52
+ }
53
+
54
+ inorder ( root ) ;
55
+ return isValid ;
56
+ } ;
You can’t perform that action at this time.
0 commit comments