괄호 삭제하기 문제는 되게 많이 나오는 문제이다. 이 문제 뿐만 아니라 짝지어 삭제하는 유형의 문제가 의외로 많다.
이번 문제의 차이점이라면 글자가 회전하는게 끼여 있다는 점인거 같다.
예전에 풀당시에는 스택으로 풀지않았는데 이번에는 스택을 사용해서 풀어봤다.
받은 문자열을 하나의 스택으로 만들고, 빈 스택을 만들어서 하나씩 뽑아가면서 짝이지어지면 삭제하는 형식으로 만들었다.
import java.util.*;
class Solution {
public boolean check(Deque<String> deque){
boolean answer = false;
Deque<String> temp = new ArrayDeque<>(deque);
Deque<String> check = new ArrayDeque<>();
while(!temp.isEmpty()){
String pop = temp.removeLast();
String peek = check.peekFirst();
String pair = "";
switch (pop) {
case "[":
pair = "]";
break;
case "{":
pair = "}";
break;
case "(":
pair = ")";
break;
}
if(check.isEmpty()){
check.addFirst(pop);
} else if (peek.equals(pair)) {
check.removeFirst();
}else {
check.addFirst(pop);
}
}
if(check.isEmpty()){
answer = true;
}
return answer;
}
public int solution(String s) {
int answer = 0;
int size = s.length();
String[] split = s.split("");
Deque<String> deque = new ArrayDeque<>(Arrays.asList(split));
while(size > 0){
boolean temp = check(deque);
String pop = deque.removeFirst();
deque.addLast(pop);
if(temp) answer += 1;
size -= 1;
}
return answer;
}
}
생각보다 시간초가 많이 나오는거 같아서 줄일수 있는 방법을 생각해봤는데, 스택에 짝이 없이 "[, {, ("가 나오면 바로 리턴하게 해봤다.
바꾸기 전에는 전체 스택을 다 돌아야했지만 케이스를 지정해줘서 바로 리턴해주는 방식을 사용하니 시간초가 많이 줄어들었다. case문이 조금 많아져서 지저분해졌지만 속도는 빨라졌다. 다음에는 코드도 조금더 정갈하게 짜보도록 해봐야겠다!