코딩테스트

프로그래머스(JAVA) - level2(짝지어 제거하기)

yeosang0508 2025. 1. 26. 15:16

문제정리

문자열 S에서 같은 알파벳이 2개 붙어있는 짝을 찾고, 제거한 뒤 앞뒤로 문자열을 이어 붙인다.
성공적으로 수행할 수 있으면 1, 아닐 경우 0

처음 작성한 코드

class Solution {
    public int solution(String s) {
        while (!s.equals("")) {
            String[] str = s.split("");
            for (int i = 0; i < str.length - 1; i++) {
                if (str[i].equals(str[i + 1])) {
                    s = "";
                    for (int j = 0; j < str.length ; j++) {
                        if (i == j) {
                            j++;
                            continue;
                        }
                        s += str[j];
                    }
                    break;
                }
                if(i == str.length -2){
                    if(!s.equals("")){
                        return 0;
                    }
                }
            }
        }
        return 1;
    }
}

 

코드를 평소와 같이 익숙한 형태와 문법으로 해결하려고 했으나

 

시간초과..... 아무리 다르게 생각을 해도 다른 해결법이 생각이 나지않아 구글링해서 다른 사람들 코드 참고해봄..;;

하긴 반복문이 삼중으로 있으니 시간이 오래 걸릴수밖에..반복문말고도 다른 해결책으로 생각을 바꿔야할듯

최종코드

class Solution {
    public int solution(String s) {
        int answer = 0;
        Stack<Character> stack = new Stack<>(); // 스택 생성 (문자 저장)

        for(char c : s.toCharArray()){ // 문자열의 각 문자를 하나씩 확인
            if(stack.size()>0 && stack.peek() == c){ // 스택이 비어있지 않고, 스택의 맨 위 문자가 현재 문자와 같다면 true
                stack.pop(); // 스택의 맨 위 문자 제거 
            }else{
                stack.push(c); // 쌍을 이루지 않으면 현재 문자를 스택에 추가 
            }
        }
        if(stack.isEmpty()){ // 반복문 종료 후 스택이 비어 있으면 
            return 1; // 문자열이 완전히 제거되어있음을 표시 
        }
        return answer; // 기본값 0 반환
    }
}

 

시간은

 

Stack이란?

Stack은 데이터를 쌓아 올리는 자료구조

LIFO (Lask In, First Out) -> 나중에 들어간 데이터가 먼저 나온다.

  • push : 스택에 데이터를 추가
  • pop : 스택의 가장 위 데이터를 꺼냄
  • peek : 스택의 가장 위 데이터를 확인 (꺼내지는 않음)