자바 알고리즘

[프로그래머스 - Java/Stack] 짝지어 제거하기

Big Iron 2023. 10. 13. 14:00

1. 문제

  • 입력받은 문자열 중 연속되는 2개의 문자가 있다면 제거하는 문제이다. 연속되는 문자가 없다면 0을 반환하고 연속되는 문자를 제거할 수 있다면 1 반환.
image

2. 의사코드

연속된 문자를 비교한다는 것을 보고 스택을 사용하여 문자 하나씩 추가하면서 비교하면 될 것 같았다.

1. 문자 하나씩 비교를 해야하기에 String이 아닌 Character 스택 생성
    Stack<Character> stack = new Stack<>();

2. 빈 스택에 첫 문자를 추가하고, 이후에 추가할 때마다 값을 비교
    stack.push(s.charAt(0));
    for(인덱스 1부터 문자열 s길이만큼){
        stack의 값과 새로 추가할 문자를 비교하여 같다면 삭제, 다르다면 추가 
    }

3. 시도

import java.util.Stack;

class Solution {
    public int solution(String s) {
        Stack<Character> stack = new Stack<>();
        stack.push(s.charAt(0));
        for(int i=1; i<s.length(); i++) {
            char c = s.charAt(i);
            if(stack.peek() == c) {
                stack.pop();
            } else if(stack.peek() != c) {
                stack.push(c);    
            } 
            if(stack.isEmpty()) {
                return 1;
            }
        }

        return 0;
    }
}
image

몇 개의 테스트를 제외하고 대부분 성공했고, 어디가 문제인지 제대로 파악하기 위해 프린트로 한 줄씩 확인했다.


image

테스트 2의 경우 문제는 없지만 테스트 1과 같은 경우에 발생한 문제였다. 스택이 다 끝나기도 전에 비었다면 1을 반환하는 문제였고 코드를 좀 더 간단히 수정하여 해결할 수 있었다.


class Solution {
    public int solution(String s) {
        Stack<Character> stack = new Stack<>();
        for(char c : s.toCharArray()) {
            if(stack.size() == 0) {
                stack.push(c);
            } else if (stack.peek() == c) {
                stack.pop();
            } else {
                stack.push(c);
            }
        }
        return stack.isEmpty() ? 1 : 0;
    }
}
image