Skip to content

Commit c819e8d

Browse files
committed
주간 복습
1 parent 2242a59 commit c819e8d

3 files changed

Lines changed: 113 additions & 0 deletions

File tree

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
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+
*/
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
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+
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
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+
*/

0 commit comments

Comments
 (0)