File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change 1+ /**
2+ * @param {string } s
3+ * @param {number } k
4+ * @return {string }
5+ */
6+ var removeDuplicates = function ( s , k ) {
7+ const stack = [ ] ;
8+ for ( let i = 0 ; i < s . length ; i ++ ) {
9+ if ( ! stack . length ) {
10+ stack . push ( [ s [ i ] , 1 ] )
11+ } else {
12+ const val = stack [ stack . length - 1 ]
13+ if ( val [ 0 ] === s [ i ] ) {
14+ if ( val [ 1 ] === k - 1 ) {
15+ stack . splice ( - ( k - 1 ) )
16+ } else {
17+ stack . push ( [ s [ i ] , val [ 1 ] + 1 ] )
18+ }
19+ } else {
20+ stack . push ( [ s [ i ] , 1 ] )
21+ }
22+ }
23+ }
24+ const ans = stack . map ( ( e ) => e [ 0 ] ) . join ( '' )
25+ return ans
26+ } ;
27+
28+ /**
29+ * 단순 스택 문제 어려울거 없음
30+ * 시간 복잡도 O(n) 각 요소는 한번씩만 push/pop됨
31+ * 공간 복잡도 O(2n) -> O(n)
32+ */
Original file line number Diff line number Diff line change 1+ /**
2+ * @param {string } s
3+ * @param {string[] } wordDict
4+ * @return {string[] }
5+ */
6+ var wordBreak = function ( s , wordDict ) {
7+ const bkArr = [ ]
8+ const ans = [ ]
9+ const bk = ( k ) => {
10+ if ( k === s . length ) {
11+ if ( bkArr . join ( '' ) === s ) {
12+ ans . push ( bkArr . join ( ' ' ) )
13+ return ;
14+ } else {
15+ return ;
16+ }
17+ }
18+ for ( let i = 0 ; i < wordDict . length ; i ++ ) {
19+ if ( k + wordDict [ i ] . length <= s . length && s . startsWith ( wordDict [ i ] , k ) ) {
20+ bkArr . push ( wordDict [ i ] )
21+ bk ( k + wordDict [ i ] . length )
22+ bkArr . pop ( )
23+ }
24+ }
25+ }
26+ bk ( 0 )
27+ return ans
28+ } ;
29+
30+ /**
31+ * 브루트포스 문제, 모든 가능성을 다 확인해야한다.
32+ * 다양한 브루트포스 실행 방법이 있지만, 백트래킹, 다른말로 dfs로 문제를 풀 수있다.
33+ * 다른 방법도 여럿 생각해봤는데, 이거 말고 해법이 없어 보였다.
34+ * 대신 여타 다른 백트래킹, 브루트포스 문제처럼 return문이 굉장히 중요했다. return문 생각안하고 모든 가능성을 다 확인했을 때는
35+ * 당연히 시간복잡도가 계속 터졋다
36+ *
37+ * 재귀에 들어가는 조건 + 재귀 리턴 조건 두가지를 신경써야했고, 재귀 리턴 조건만 사용했을 때는 시간 복잡도가 터졌다
38+ *
39+ * 재귀 들어가는 조건에서 새로 알게된 method는 startsWith 메소드를 새로 알게됨.
40+ * s.startsWith(word, i) : s의 i번째 인덱스부터 확인했을 때, word로 시작되는지 확인하는 메소드이다.
41+ *
42+ * 문제의 시간복잡도는: 가지치기 가능 경우의수 : n, 트리의 깊이: n,
43+ * -> 결론은 O(n^n)
44+ * 공간 복잡도: 트리의 깊이 O(n): bkArr의 최악의 크기가 n임
45+ *
46+ * 공간복잡도 잘 모르는데, 트리의 깊이로 해야하는건지 배열의 최악의 크기로 해야하는지 잘 모르겟음
47+ */
48+
Original file line number Diff line number Diff line change 1+ /**
2+ * @param {number[] } heights
3+ * @return {number[] }
4+ */
5+ var canSeePersonsCount = function ( heights ) {
6+ const stack = [ ] ;
7+ const ans = [ ]
8+ for ( let i = heights . length - 1 ; i >= 0 ; i -- ) {
9+ let count = 0
10+
11+ if ( stack . length ) {
12+ for ( let j = stack . length - 1 ; j >= 0 ; j -- ) {
13+ if ( stack [ j ] >= heights [ i ] ) {
14+ count ++
15+ break ;
16+ } else {
17+ count ++
18+ stack . pop ( )
19+ }
20+ }
21+ }
22+ ans . push ( count )
23+ stack . push ( heights [ i ] )
24+ }
25+ return ans . reverse ( )
26+ } ;
27+
28+ /**
29+ * - monotonic stack 대표 문제
30+ * - 7,6,5가 있을 때, 7은 6뒤의 5를 볼 수 있는지 없는지를 가지고 헷갈리게하는 문제가 많음
31+ * - 시간 복잡도: O(n), 2중 for문이라서 O(n2)으로 볼 수 있지만, 각 요소는 최대 1번씩 push/pop 되므로 O(n)이다.
32+ * - 공간 복잡도: O(n) 해당 문제에서 생성하는 배열은 2개 각각 ans, stack. 둘다 최대 n개의 원소만을 넣을 수 있음
33+ */
You can’t perform that action at this time.
0 commit comments