File tree Expand file tree Collapse file tree 5 files changed +140
-0
lines changed
longest-common-subsequence
longest-repeating-character-replacement Expand file tree Collapse file tree 5 files changed +140
-0
lines changed Original file line number Diff line number Diff line change 1+ // Definition for a _Node.
2+ function _Node ( val , neighbors ) {
3+ this . val = val === undefined ? 0 : val ;
4+ this . neighbors = neighbors === undefined ? [ ] : neighbors ;
5+ } ;
6+
7+ /**
8+ * 그래프를 깊은 복사하여 반환하는 함수
9+ * @param {_Node } node
10+ * @return {_Node }
11+ */
12+ const cloneGraph = function ( node ) {
13+ if ( ! node ) return null ;
14+
15+ function dfs ( node , visited ) {
16+ const current = new _Node ( node . val ) ;
17+ visited . set ( node , current ) ;
18+
19+ node . neighbors . forEach ( ( neighbor ) => {
20+ const clonedNeighbor = visited . has ( neighbor ) ? visited . get ( neighbor ) : dfs ( neighbor , visited ) ;
21+ current . neighbors . push ( clonedNeighbor ) ;
22+ } ) ;
23+
24+ return current ;
25+ }
26+
27+ return dfs ( node , new Map ( ) ) ; // visited: 원본 노드를 key, 클론한 노드를 value로 하는 맵
28+ } ;
29+
30+ // 시간복잡도: O(V + E) (모든 노드와 간선을 한 번씩 순회)
31+ // 공간복잡도: O(V) (visited 맵 + 재귀 호출 스택)
Original file line number Diff line number Diff line change 1+ /**
2+ * 가장 긴 공통 부분 수열의 길이를 반환하는 함수
3+ * @param {string } text1
4+ * @param {string } text2
5+ * @return {number }
6+ */
7+ const longestCommonSubsequence = function ( text1 , text2 ) {
8+ const dp = Array . from ( { length : text1 . length } , ( ) => Array . from ( { length : text2 . length } , ( ) => - 1 ) ) ;
9+
10+ // text1, 2를 순회하는 포인터 i, j를 두고, 두 문자끼리 비교하는 함수
11+ function dfs ( i , j ) {
12+ // 포인터가 범위를 넘어가면 백트래킹
13+ if ( i === text1 . length || j === text2 . length ) {
14+ return 0 ;
15+ }
16+
17+ // 두 문자를 이미 비교한 적 있는 경우 해당 결과 반환
18+ if ( dp [ i ] [ j ] !== - 1 ) {
19+ return dp [ i ] [ j ] ;
20+ }
21+
22+ // 두 문자를 비교
23+ if ( text1 [ i ] === text2 [ j ] ) {
24+ dp [ i ] [ j ] = 1 + dfs ( i + 1 , j + 1 ) ;
25+ } else {
26+ dp [ i ] [ j ] = Math . max ( dfs ( i + 1 , j ) , dfs ( i , j + 1 ) ) ;
27+ }
28+
29+ return dp [ i ] [ j ] ;
30+ }
31+
32+ return dfs ( 0 , 0 ) ;
33+ } ;
34+
35+ // 시간복잡도: O(m * n) (m: text1.length, n: text2.length)
36+ // 공간복잡도: O(m * n) (재귀 호출 깊이: m + n, dp 배열 크기: m * n)
Original file line number Diff line number Diff line change 1+ /**
2+ * 주어진 문자열에서 최대 k개를 대체해 가장 긴 동일 문자 반복 부분 문자열을 만들 수 있을 때,
3+ * 이 문자열의 길이를 반환하는 함수
4+ * @param {string } s
5+ * @param {number } k
6+ * @return {number }
7+ */
8+ const characterReplacement = function ( s , k ) {
9+ let start = 0 ;
10+ let end = 0 ;
11+ let counter = { } ;
12+ let maxFrequent = 0 ; // 현재 구간에 가장 많이 포함되어 있는 알파벳의 총 개수
13+ let maxLength = 0 ;
14+
15+ while ( start <= end && end < s . length ) {
16+ counter [ s [ end ] ] = ( counter [ s [ end ] ] || 0 ) + 1 ;
17+ maxFrequent = Math . max ( maxFrequent , counter [ s [ end ] ] ) ;
18+
19+ while ( end - start + 1 - maxFrequent > k ) {
20+ counter [ s [ start ] ] -- ;
21+ start ++ ;
22+ }
23+
24+ maxLength = Math . max ( end - start + 1 , maxLength ) ;
25+ end ++ ;
26+ }
27+
28+ return maxLength ;
29+ } ;
30+
31+ // 시간복잡도: O(n)
32+ // 공간복잡도: O(1)
Original file line number Diff line number Diff line change 1+ /**
2+ * 회문인 부분 문자열의 개수를 반환하는 함수
3+ * @param {string } s
4+ * @return {number }
5+ */
6+ const countSubstrings = function ( s ) {
7+ let count = 0 ;
8+
9+ for ( let i = 0 ; i < s . length ; i ++ ) {
10+ let substr = '' ;
11+ let reversed = '' ;
12+
13+ for ( let j = i ; j < s . length ; j ++ ) {
14+ substr += s [ j ] ;
15+ reversed = s [ j ] + reversed ;
16+ if ( substr === reversed ) {
17+ count += 1 ;
18+ }
19+ }
20+ }
21+
22+ return count ;
23+ } ;
24+
25+ // 시간복잡도: O(n^2)
26+ // 공간복잡도: O(n)
Original file line number Diff line number Diff line change 1+ /**
2+ * 주어진 32비트 unsingned integer를 뒤집어 십진수로 반환하는 함수
3+ * @param {number } n - a positive integer
4+ * @return {number } - a positive integer
5+ */
6+ const reverseBits = function ( n ) {
7+ const binary = n . toString ( 2 ) . padStart ( 32 , '0' ) ;
8+ const reversed = Array . from ( binary ) . reverse ( ) . join ( '' ) ;
9+ const decimal = parseInt ( reversed , 2 ) . toString ( 10 ) ;
10+
11+ return Number ( decimal ) ;
12+ } ;
13+
14+ // 시간복잡도: O(1)
15+ // 공간복잡도: O(1)
You can’t perform that action at this time.
0 commit comments