File tree Expand file tree Collapse file tree 5 files changed +209
-0
lines changed
product-of-array-except-self
validate-binary-search-tree Expand file tree Collapse file 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