File tree Expand file tree Collapse file tree 5 files changed +184
-0
lines changed
search-in-rotated-sorted-array Expand file tree Collapse file tree 5 files changed +184
-0
lines changed Original file line number Diff line number Diff line change 1+ /**
2+ * @param {number } numCourses
3+ * @param {number[][] } prerequisites
4+ * @return {boolean }
5+ */
6+ const canFinish = function ( numCourses , prerequisites ) {
7+ // 강의 간 관계 그래프 생성
8+ const relation = Array . from ( { length : numCourses } ) . map ( ( ) => new Set ( ) ) ;
9+ for ( const [ current , prev ] of prerequisites ) {
10+ relation [ current ] . add ( prev ) ;
11+ }
12+
13+ const visiting = new Set ( ) ; // 수강할 수 있는지 확인하기 위해 순회중인 강의
14+ const visited = new Set ( ) ; // 수강 가능한 강의
15+
16+ function dfs ( current ) {
17+ if ( visiting . has ( current ) ) {
18+ return false ;
19+ }
20+ if ( visited . has ( current ) ) {
21+ return true ;
22+ }
23+ visiting . add ( current ) ;
24+
25+ for ( const prev of relation [ current ] ) {
26+ if ( visiting [ prev ] || ! dfs ( prev ) ) {
27+ return false ;
28+ }
29+ }
30+
31+ visiting . delete ( current ) ;
32+ visited . add ( current )
33+
34+ return true ;
35+ }
36+
37+ // 강의마다 순회
38+ for ( let i = 0 ; i < numCourses ; i ++ ) {
39+ if ( ! visited [ i ] && ! dfs ( i ) ) {
40+ return false ;
41+ }
42+ }
43+
44+ return true ;
45+ } ;
Original file line number Diff line number Diff line change 1+ /**
2+ * Definition for a binary tree node.
3+ * function TreeNode(val, left, right) {
4+ * this.val = (val===undefined ? 0 : val)
5+ * this.left = (left===undefined ? null : left)
6+ * this.right = (right===undefined ? null : right)
7+ * }
8+ */
9+
10+ /**
11+ * 이진 트리를 좌우 반전하여 반환하는 함수
12+ * @param {TreeNode } root
13+ * @return {TreeNode }
14+ */
15+ const invertTree = function ( root ) {
16+ if ( root !== null ) {
17+ invertTree ( root . right ) ;
18+ invertTree ( root . left ) ;
19+ [ root . right , root . left ] = [ root . left , root . right ] ;
20+ }
21+
22+ return root ;
23+ } ;
24+
25+ // 시간복잡도: O(n)
26+ // 공간복잡도: O(n)
Original file line number Diff line number Diff line change 1+ /**
2+ * @param {number[] } nums
3+ * @return {boolean }
4+ */
5+ const canJump = function ( nums ) {
6+ // 마지막 인덱스에서 첫 인덱스로 거꾸로 돌면서
7+ // 필요한 점프 횟수를 변수에 저장
8+ // 만약 인덱스 i의 값이 필요한 점프 횟수를 충족한다면 초기화
9+
10+ let need = 1 ;
11+ let answer = true ;
12+
13+ for ( let i = nums . length - 2 ; i >= 0 ; i -- ) {
14+ if ( nums [ i ] >= need ) {
15+ need = 1 ;
16+ answer = true ;
17+ } else {
18+ need += 1 ;
19+ answer = false ;
20+ }
21+ }
22+
23+ return answer ;
24+ } ;
25+
26+ // 시간복잡도: O(n)
27+ // 공간복잡도: O(1)
Original file line number Diff line number Diff line change 1+ /**
2+ * Definition for singly-linked list.
3+ * function ListNode(val, next) {
4+ * this.val = (val===undefined ? 0 : val)
5+ * this.next = (next===undefined ? null : next)
6+ * }
7+ */
8+ /**
9+ * @param {ListNode[] } lists
10+ * @return {ListNode }
11+ */
12+ const mergeKLists = function ( lists ) {
13+ // 각 노드의 val 별 개수를 객체로 나타냄
14+ const counter = { } ;
15+
16+ for ( let list of lists ) {
17+ let node = list ;
18+ while ( node ) {
19+ counter [ node . val ] = ( counter [ node . val ] || 0 ) + 1 ;
20+ node = node . next ;
21+ }
22+ }
23+
24+ // 위에서 만든 객체를 오름차순으로 순회하면서 node와 list를 생성
25+ let head = new ListNode ( ) ;
26+ let current = head ;
27+ const entries = Object . entries ( counter ) . sort ( ( [ val1 ] , [ val2 ] ) => Number ( val1 ) - Number ( val2 ) ) ; // val 기준 오름차순 정렬
28+
29+ for ( let i = 0 ; i < entries . length ; i ++ ) {
30+ const [ val , count ] = entries [ i ] ;
31+
32+ for ( let j = 0 ; j < count ; j ++ ) {
33+ const node = new ListNode ( Number ( val ) ) ;
34+ current . next = node ;
35+ current = current . next ;
36+ }
37+ }
38+
39+ return head . next ;
40+ } ;
41+
42+ // 시간복잡도: O(n * log n) (sort에서 n * log n, 순회와 리스트 구성에서는 n)
43+ // 공간복잡도: O(n)
44+
45+ // 최소힙을 통해 최적화를 할 수 있음
Original file line number Diff line number Diff line change 1+ /**
2+ * 주어진 배열에서 타겟의 인덱스를 찾아 반환하는 함수
3+ * @param {number[] } nums
4+ * @param {number } target
5+ * @return {number }
6+ */
7+ const search = function ( nums , target ) {
8+ let left = 0 ;
9+ let right = nums . length ;
10+ let mid = Math . floor ( ( left + right ) / 2 ) ;
11+
12+ while ( left < right ) {
13+ mid = Math . floor ( ( left + right ) / 2 ) ;
14+
15+ if ( nums [ mid ] === target ) break ;
16+
17+ // left부터 mid까지 잘 정렬되어 있는 경우 (=> rotate된 부분은 mid부터 right 사이에 있음)
18+ if ( nums [ left ] < nums [ mid ] ) {
19+ // 정렬된 left부터 mid 사이에 타겟이 있는 경우
20+ if ( nums [ left ] <= target && target <= nums [ mid ] ) {
21+ right = mid ;
22+ } else {
23+ left = mid + 1 ;
24+ }
25+ }
26+ // mid부터 right까지 잘 정렬되어 있는 경우 (=> rotate된 부분은 left부터 mid 사이에 있음)
27+ else {
28+ // 정렬된 mid부터 right 사이에 타겟이 있는 경우
29+ if ( nums [ mid ] <= target && target <= nums [ right - 1 ] ) {
30+ left = mid ;
31+ } else {
32+ right = mid ;
33+ }
34+ }
35+ }
36+
37+ return nums [ mid ] === target ? mid : - 1 ;
38+ } ;
39+
40+ // O(log n)
41+ // O(1)
You can’t perform that action at this time.
0 commit comments