프로그래머스 Level2의 문제인 짝지어 제거하기 문제
해결 방법으로 StringBuilder로 중복되는 문자가 올 경우 해당문자 2개를 삭제하는 방법으로 접근했다.
class Solution {
public int solution(String s) {
StringBuilder sb = new StringBuilder(s);
for (int i = 0; i < sb.length() - 1; i++) {
if (sb.charAt(i) == sb.charAt(i + 1)) {
sb.deleteCharAt(i);
sb.deleteCharAt(i);
i = -1;
}
}
if (sb.length() == 0) {
return 1;
} else {
return 0;
}
}
}
하지만 이렇게 해결하니 예제는 통과 되었지만 효율성 검사에서 통과하지 못했다. 그 이유는 한번 반복하는데 여러번 돌기 때문 만약 문자의 길이가 길수록 반복하는 횟수가 많아져서 그런것 같았다.
그래서 생각한것이 스택을 사용하여 만들어진 문자열을 가지고 반복하기 보다는 검사 후 문자를 만드는 방식으로 생각했다.
스택은 가장 나중에 들어온 데이터가 가장 먼저 빠져나가는 후입선출 구조로 되어 있어, 프로그래밍에서 데이터가 입력된 순서대로 처리되는 것이 아닌, 가장 나중에 들어온 데이터를 먼저 처리할 때 사용한다.
import java.util.Stack;
class Solution {
public int solution(String s) {
Stack<Character> stack = new Stack<>();
for (char c : s.toCharArray()) {
if (!stack.isEmpty() && stack.peek() == c) {
stack.pop(); // 연속된 문자 제거
} else {
stack.push(c); // 문자 추가
}
}
return stack.isEmpty() ? 1 : 0;
}
}
이렇게 스택이 비어있지 않으면서 스택의 마지막 데이터의 값을 불러오는 peek()을 사용하여 반복문을 이용하여 문자가 같으면 삭제하고 추가하지 않도록 하여 해결하였다.
이렇게 하니 확실히 실행시간이 줄고 유효성 검사까지 통과하였다.
해결 후 다른분들의 풀이를 보니 많이들 스택을 이용하여서 푸셨고, List를 사용하여 푸신분도 계셨다.