프로그래머스 - 짝지어 제거하기 (Lv.2)

less than 1 minute read

문제 링크

문제 접근

  • 최대 문자열 길이기 백만이라는 것을 고려했을 때, 시간복잡도를 최소화 해야 한다.
  • 문자열의 인덱스를 가리키는 front, rear 변수를 제어하며 짝지어진 문자열을 삭제하는 작업을 한다.
  • 이때, 중간에 문자열이 제거되면 앞부분과 뒷부분이 합쳐지게 되기 때문에 앞에서 부터 제거되지 못한 문자열은 스택 자료구조로 담아둔다.
    • 최근에 제거되지 못한 문자와 rear의 문자가 짝을 짓는지 확인해야 하기 떄문에 LIFO 구조가 필요하다.

구현1(All Pass)

#include <iostream>
#include <string>
#include <vector>
#include <stack>
using namespace std;

int solution(string s)
{
    int answer = -1;
    int len = s.length();
    int front = 0, rear = front+1;
    stack<int> not_removed;
    
    while(true){
        if(front>=len){
            answer = 1;
            break;
        }
        if(rear>=len){
            answer = 0;
            break;
        }
        
        if(s[front]==s[rear]){
            rear++;
            if(not_removed.size()==0)
                front = rear++;
            else{
                front = not_removed.top();
                not_removed.pop();
            }
        }
        else{
            not_removed.push(front);
            front = rear++;
        }
    }
    

    return answer;
}

구현2

#include <iostream>
#include <string>
using namespace std;

int solution(string s)
{
    string nstr;
    for(int i=0; i<s.length(); i++){
        if(nstr.length()==0) nstr.push_back(s[i]);
        else if(nstr.back() == s[i]) nstr.pop_back();
        else if(nstr.back() != s[i]) nstr.push_back(s[i]);
    }
    if(nstr.length()==0) return 1;
    else return 0;
}

Leave a comment