프로그래머스 짝지어 제거하기 in Java

PEPPERMINT100·2020년 11월 6일
0

문제

문제 설명
짝지어 제거하기는, 알파벳 소문자로 이루어진 문자열을 가지고 시작합니다. 먼저 문자열에서 같은 알파벳이 2개 붙어 있는 짝을 찾습니다. 그다음, 그 둘을 제거한 뒤, 앞뒤로 문자열을 이어 붙입니다. 이 과정을 반복해서 문자열을 모두 제거한다면 짝지어 제거하기가 종료됩니다. 문자열 S가 주어졌을 때, 짝지어 제거하기를 성공적으로 수행할 수 있는지 반환하는 함수를 완성해 주세요. 성공적으로 수행할 수 있으면 1을, 아닐 경우 0을 리턴해주면 됩니다.

예를 들어, 문자열 S = baabaa 라면

b aa baa → bb aa → aa →

의 순서로 문자열을 모두 제거할 수 있으므로 1을 반환합니다.

제한사항

  • 문자열의 길이 : 1,000,000이하의 자연수
  • 문자열은 모두 소문자로 이루어져 있습니다.

접근

처음엔 원시적으로 ArrayList를 만들고 값이 같으면 인덱스 값들을 지워주는 식으로 했지만 효율성 테스트를 통과하지 못하였다. 다시 알고리즘 계획을 짜고 스택으로 접근하니 간단하고 효율적인 코드를 작성할 수 있었다. 문자열을 for문으로 돌면서 스택의 값과 비교하여 같으면 버리고 같지 않다면 push해주는 식으로 풀었다. 알고리즘을 처음 공부할 때 비슷한 문제를 풀었었는데, 최근 코딩 테스트를 준비하며 BFS, DFS, DP, Brute Force 등 어느정도 정해진 유형만 생각하며 접근하다보니 가장 기본이 되는 큐와 스택의 중요성을 간과하였다. 정답 코드는 아래와 같다.

import java.util.*;

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

       for(int i=0; i<s.length(); i++){
           if(stack.isEmpty()){
               stack.push(String.valueOf(s.charAt(i)));
           }else{
               String lastVal = stack.peek();
               String currVal = String.valueOf(s.charAt(i));
               if(!lastVal.equals(currVal)){
                   stack.push(currVal);
               }else{
                   stack.pop();
               }
           }
       }

       return stack.size() == 0 ? 1 : 0;
   }
}
profile
기억하기 위해 혹은 잊어버리기 위해 글을 씁니다.

0개의 댓글