PS/Medium
2390. Removing Stars From a String (Stack)
우봉수
2023. 4. 11. 10:19
<아이디어>
'*' 가 나올 경우 바로 앞에 있는 요소를 제거해야 한다는 점에서 선입선출 FIFO 개념인 Stack을 생각을 할 수 있었고
Stack의 담은 문자들을 하나로 합치는데 시간을 단축 시키기 위해 StrringBuilder를 생각 할 수 있었다.
<코드>
import java.util.Stack;
class Solution {
// 시간 복잡도 O(n) 공간 복잡도 O(n)
public String removeStars(String s) {
Stack<Character> stack = new Stack<>();
StringBuilder ans = new StringBuilder();
for (int i = 0; i < s.length(); i++) {
char unit = s.charAt(i);
if(unit!='*')
stack.push(unit);
else
stack.pop();
}
for (Character character : stack)
ans.append(character);
return ans.toString();
}
}
+ 해당 문제를 Stack을 사용하지 않고 구현으로 풀 경우
이점: Stack을 사용한 것과 시간 복잡도 자체는 같지만 Stack의 push pop의 사전 과정이 필요가 없기 때문에 더 빠른 속도를 가지고 있다.
class Solution2 {
// 시간 복잡도 O(n) 공간 복잡도 O(n)
public String removeStars(String s) {
int len = s.length();
char[] chars = new char[len];
int index = len, count = 0;
// 문자열 s의 뒤에서 부터 시작
for (int i = len - 1; i >= 0; i--) {
char c = s.charAt(i);
// *이 오면 제거해야할 문자 수 count++
if (c == '*') {
count++;
}
// *이 아니고 제거해야 할 문자가 아니라면 char 배열에 추가
else {
if (count > 0) {
count--;
} else {
chars[--index] = c;
}
}
}
// char 배열의 마지막으로 추가한 문자의 인덱스 부터 ~ 유효한 마지막 인덱스 까지의 범위 를 바탕으로 문자열을 만들어 반환
return String.valueOf(chars, index, len - index);
}
}