File tree Expand file tree Collapse file tree 3 files changed +111
-0
lines changed
product-of-array-except-self Expand file tree Collapse file tree 3 files changed +111
-0
lines changed Original file line number Diff line number Diff line change 1+ /**
2+ * @param {number[] } nums
3+ * @return {number[] }
4+ */
5+ var productExceptSelf = function ( nums ) {
6+ const result = new Array ( nums . length ) . fill ( 1 ) ; // 결과값
7+
8+ // 왼쪽 곱 계산
9+ let leftProduct = 1 ;
10+ for ( let i = 0 ; i < nums . length ; i ++ ) {
11+ result [ i ] = leftProduct ;
12+ leftProduct *= nums [ i ] ;
13+ }
14+
15+ // 오른쪽 곱 계산해서 왼쪽 곱 계산한거 곱해주기
16+ let rightProduct = 1 ;
17+ for ( let i = nums . length - 1 ; i >= 0 ; i -- ) {
18+ result [ i ] *= rightProduct ;
19+ rightProduct *= nums [ i ] ;
20+ }
21+
22+ return result ;
23+ } ;
24+
25+ // 조건에 O(n)이라고 있음
26+ // 시간 복잡도: O(n)
27+ // 공간 복잡도: O(n)
Original file line number Diff line number Diff line change 1+ /**
2+ * @param {number } n - a positive integer
3+ * @return {number } - a positive integer
4+ */
5+ var reverseBits = function ( n ) {
6+ // 문자열로 변환
7+ let nString = n . toString ( 2 ) . padStart ( 32 , "0" ) ;
8+ //console.log(nString);
9+
10+ // 스택 생성 (스택은 나중에 들어온게 먼저 나가므로)
11+ let stack = [ ] ;
12+
13+ // nString 스택에 넣기
14+ for ( let i = 0 ; i < nString . length ; i ++ ) {
15+ stack . push ( nString [ i ] ) ;
16+ }
17+
18+ // pop하여 뒤집힌 문자열 만들기
19+ let reverseNString = "" ;
20+ for ( let i = 0 ; i < nString . length ; i ++ ) {
21+ reverseNString += stack . pop ( ) ;
22+ }
23+
24+ // 뒤집힌 문자열을 정수로 변환
25+ return parseInt ( reverseNString , 2 ) ;
26+ } ;
27+
28+ // 시간 복잡도: O(1)
29+ // 공간 복잡도: O(1)
Original file line number Diff line number Diff line change 1+ /**
2+ * @param {number[] } nums
3+ * @param {number } target
4+ * @return {number[] }
5+ */
6+ var twoSum = function ( nums , target ) {
7+ for ( let i = 0 ; i < nums . length ; i ++ ) {
8+ for ( let j = 0 ; j < nums . length ; j ++ ) {
9+ if ( i !== j ) {
10+ if ( nums [ i ] + nums [ j ] === target ) {
11+ return [ i , j ] ;
12+ }
13+ }
14+ }
15+ }
16+ } ;
17+
18+ // 처음에 풀었던 방법 -> 시간 복잡도가 O(n^2)로 nums 배열에 있는 값이 늘어날수록 성능상 좋지 못함
19+ // 시간 복잡도: O(n^2)
20+ // 공간 복잡도: O(1)
21+
22+ // 두 번째 푼 방법 -> 이전에 threeSum 문제 풀 때 정렬 + 포인터 이용한 것처럼 이 문제도 그런식으로 품
23+ /**
24+ * @param {number[] } nums
25+ * @param {number } target
26+ * @return {number[] }
27+ */
28+ var twoSum = function ( nums , target ) {
29+ const numsIndex = nums . map ( ( num , i ) => ( { num, i } ) ) ; // 원래 인덱스 저장
30+ //console.log(numsIndex);
31+
32+ numsIndex . sort ( ( a , b ) => a . num - b . num ) ; // 오름차순 정렬
33+ //console.log(numsIndex);
34+
35+ // left와 right 포인터 이용해 target값과 동일한 것 찾기
36+ let left = 0 ;
37+ let right = numsIndex . length - 1 ;
38+
39+ while ( left < right ) {
40+ const sum = numsIndex [ left ] . num + numsIndex [ right ] . num ;
41+
42+ if ( sum > target ) {
43+ right -- ;
44+ } else if ( sum < target ) {
45+ left ++ ;
46+ } else {
47+ return [ numsIndex [ left ] . i , numsIndex [ right ] . i ] ;
48+ }
49+ }
50+ return null ;
51+ } ;
52+
53+ // 첫 번째 푼 방법보다 공간 복잡도가 늘어났지만 시간 복잡도는 줄어듦
54+ // 시간 복잡도: O(n log n)
55+ // 공간 복잡도: O(n)
You can’t perform that action at this time.
0 commit comments