Home P12973. 짝지어 제거하기
Post
Cancel

P12973. 짝지어 제거하기

문제

image


제출 코드

  • 사용 알고리즘 : 자료구조, 스택


문자열을 짝지어서 같은 문자끼리 없애고, 다시 붙이고를 반복하여 전체 문자열을 제거할수 있는지 묻는 문제이다.


처음엔 간단하게 생각하고 문자열을 첫 자리부터 읽어 짝지은 문자가 나오면 그 부분을 제외하고 앞뒤 문자열을 다시 이어 붙이는 식으로 연결해서, 남는 문자열이 있는지 확인하는 방식으로 했다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// 첫번째 풀이 (실패)
import java.util.*;

class Solution
{
    public int solution(String s)
    {
        String str = s;
        int idx = 0;

        while(str.length()>0 && idx+1<str.length()){
            if(str.charAt(idx) == str.charAt(idx+1)){
                if(idx == 0){
                    str = str.substring(2, str.length());
                }else{
                    str = str.substring(0, idx) + str.substring(idx+2, str.length());
                    idx -= 1;
                }
            }else{
                idx++;
            }
        }

    }
}


그런데 이렇게 풀면 유효성 검사에서 모두 시간초과가 난다.

시간복잡도가 그렇게 크진 않다고 생각했는데, charAt과 subString, length 등 String의 메서드의 잦은 호출이 문제가 된다고 생각된다.


어떻게 바꿔야 하나 고민했는데, 생각해보면 이 문제는 고민할 필요가 없는 전형적인 stack 사용 문제였다.

짝 비교를 무조건 직전에 지나온 문자열과 비교하기 때문에, 문자열의 처음부터 시작해서 스택이 비어있거나 짝이 맞지 않으면 스택에 저장하고 가장 최상단의 문자와 짝 비교를 하면 된다.

이렇게 풀면 딱 문자열 길이만큼 탐색하기에 시간복잡도도 미세하게 더 줄어드는거 같기도?


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 두번째 풀이 (성공)
import java.util.*;

class Solution
{
    public int solution(String s)
    {
        Stack<Character> stack = new Stack<Character>();
        int size = s.length();

        for(int i=0; i<size; i++){
            if(stack.isEmpty() || stack.peek()!=s.charAt(i)) stack.push(s.charAt(i));
            else stack.pop();
        }

        if(stack.isEmpty()) return 1;
        else return 0;
    }
}
This post is licensed under CC BY 4.0 by the author.