코딩테스트

[ 프로그래머스 ] 짝지어 제거하기

Adose 2025. 2. 13. 09:29

📘요구 사항 정리

  • 짝지어 제거하기는, 알파벳 소문자로 이루어진 문자열을 가지고 시작한다.
  • 먼저 문자열에서 같은 알파벳이 2개 붙어있는 짝을 찾는다.
  • 그 다음 그 둘(알파벳 2개 붙어있는 짝) 을 제거한뒤, 앞 뒤로 문자열을 다시 이어 붙인다.
  • 이 과정을 반복해서 문자열을 모두 제거한다면 짝지어 제거하기가 종료된다.
  • 성공적으로 수행시 1 반환
  • 실패 시 0 번환

 

📌 제약 조건

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

 

📌 구현코드 -1 

package pra.lv2.짝지어제거하기;

import java.util.Stack;

public class answer_1 {
    public static void main(String[] args) {
        int result = solution("baabaa");
        System.out.println(result);

    }

    public static int solution(String s) {
        Stack<Character> list  = new Stack<>();
        int result =0;

        for(int i=0;i<s.length();i++){
            char data = s.charAt(i);
            if(list.empty()){
                list.push(data);
            } else if (list.peek()==data) {
                list.pop();
            }else{
                list.push(data);
            }

        }
          if(list.isEmpty()){
                result =1;
            }
            
        return result;

    }

}

 

📌 구현코드 해설

  • 문자열에서 데이터를 하나씩 꺼낸다.
  • for문을 통해서 if - stack이 비어있다면, 문자를 하나 넣어준다.
  • else - if로 stack이 비어 있지 않다면, 마지막 으로 들어간 문자를 꺼내고 현재 문자와 비교한 뒤 같으면 pop()해준다.
  • 만약 비어 있지도 않고, 같지도 않으면 값을 push 해준다.
  • for문을 다 돌고 list가 비어있다면 return 1을 해준다.

 

 

📌 구현코드 - 2

 public static int solution2(String s) {

        Stack<Character> list = new Stack<>();

        for (Character data : s.toCharArray()) {
            if (list.empty()) {
                list.push(data);
            } else if (list.peek() == data) {
                list.pop();
            } else {
                list.push(data);
            }
        }

        return list.empty() ? 1 : 0;
    }

 

📌 구현코드 해설 -2

  • 처음 코드에서 보완해서 사용할 수 있을 것 같아서 수정해보았다.
  • for - each를 사용하여 바로 접근할 수 있도록 문자열을 toCharArray()를 사용하여 배열로 바꿔주었다.
  • 아래와 같은 차례로 if문이 실행된다.
  1. stack이 비어있다면, 값을 추가해주고
  2. stack이 비어 있지 않다면, peek()을 통해서 마지막 문자와 현재 문자를 비교해준다.
    • 마지막 문자와 현재 문자가 같다면
    • 마지막 문자를 peek()해준다.
    • 현재 문자는 push되지 않는다.
  3. 만약 값이 비어 있지도 않고, 마지막 문자와 같지도 않으면 stack에 값을 push해준다 .
  • for문이 끝나면 stack이 비어 있는지 확인후, 비어 있다면 1 비어있지 않다면 0을 return해주었다.