프로그래머스 | LV.2 짝지어 제거하기 - Stack 활용 (Java)

728x90

⬛ 프로그래머스 | LV.2 짝지어 제거하기 - Stack 활용

https://school.programmers.co.kr/learn/courses/30/lessons/12973

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제 설명

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

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

b aa baa → bb aa → aa →

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

제한사항

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

입출력 예시


💚나의 풀이

  • 이 문제를 딱 봤을 때 처리해야 하는 큰 2가지 쟁점이 떠오를 것이다.

(1) 연달아 2개의 문자가 짝을 이룬다는 걸 어떻게 확인할 거냐 ?

(2) 그걸 확인했다면 어떻게 제거할 거냐 ?

  • 바로 스택(Stack) 을 활용하여 풀면 된다.
  • 처음 마주했을 때, 문자열을 for문이든 while() 문이든 처리하려고 했다면 무조건 틀린다. 무.조.건
  • 제한 사항을 보면 알겠지만, 문자열 길이는 최대 1,000,000 만큼 들어오기 때문이다. 이중 for문만 돌려도 초과가 뜰 것이다.

[풀이 과정]

  1. 처음부터 길이가 0인 String 값이 들어올 경우, 애초에 어떤 처리도 불가능한 상태. 0반환
  2. idx = 0 일 때, 첫 글자를 스택에 push한다. 그리고, idx = 0→1
  3. idx = 1인 상태에서 while() 문을 진입한다. 
    (1) 현재 c의 값은 ‘a’ 가 된다. idx = 1 → 2
    peek()한 값인 ‘b’와 현재 c의 값인 ‘a’가 다르다. 따라서 현재 ‘a’값을 스택에 push() 처리
    (2) 현재 c의 값은 ‘a’가 된다. idx = 2 → 3
    peek()한 값은 ‘a’이고, 현재 값도 ‘a’로 같다. 따라서 스택 값 pop() 처리
    (3) 현재 c의 값은 ‘b’가 된다. idx = 3 → 4
    peek()한 값은 ‘b’이고, 현재 값도 ‘b’로 같다. 따라서 스택 값 pop() 처리
    (4) 현재 c의 값은 ‘a’가 된다. idx = 4 → 5
    스택이 현재 isEmpty()인 상태이므로, 현재값을 스택에 push() 처리
    (5) 현재 c의 값은 ‘a’가 된다, idx = 5 → 6
    peek()한 값은 ‘a’ 이고, 현재 값도 ‘a’로 같다. 따라서 스택 pop() 처리한다.
    동시에, 현재 idx값이 6이 된 상태이다. while()문의 조건 탈락해서 탈출한다.
  4. while()문을 탈출한 상태에서, 스택의 상태가 빈 상태이면 모두 처리한 것이므로 1을 반환, 아니라면 0을 반환한다.

💚 제출 코드

import java.util.*;

class Solution{
    public int solution(String s) {
        int answer = -1;
        Stack<Character> stack = new Stack<>();
        int idx = 0; //인덱스 지칭용 
        
        if(s.length() == 0){ //처음부터 길이 0 짜리가 들어왔다면 
            return 0; //그냥 적용 불가능한 상태이므로 - 0 반환
        }
        
				//1) 첫 글자는 스택에 push
        stack.push(s.charAt(idx));
        idx++;
        while(idx<s.length()){
            char c = s.charAt(idx);
            idx++;
            if(!stack.isEmpty() && stack.peek() == c){
                stack.pop();
            }else{
                stack.push(c);
            }
        }
        
        if(stack.isEmpty()){
            answer = 1;
        }else{
            answer= 0;
        }
        return answer;
    }
}
728x90