문제 설명
짝지어 제거하기는, 알파벳 소문자
로 이루어진 문자열을 가지고 시작합니다. 먼저 문자열에서 같은 알파벳이 2개 붙어 있는 짝을 찾습니다. 그다음, 그 둘을 제거한 뒤, 앞뒤로 문자열을 이어 붙입니다. 이 과정을 반복해서 문자열을 모두 제거한다면 짝지어 제거하기가 종료됩니다. 문자열 S가 주어졌을 때, 짝지어 제거하기를 성공적으로 수행할 수 있는지 반환하는 함수를 완성해 주세요. 성공적으로 수행할 수 있으면 1을, 아닐 경우 0을 리턴해주면 됩니다.
예를 들어, 문자열 S = baabaa 라면
baabaa → bbaa → aa →
의 순서로 문자열을 모두 제거할 수 있으므로 1을 반환합니다.
제한사항
- 문자열의 길이 : 1,000,000이하의 자연수
- 문자열은 모두 소문자로 이루어져 있습니다.
해결 방법
문제 그대로 구현 하다가 시간 초과로 효율성을 테케를 통과하지 못했다.
문자열의 처음부터 탐색하면서 동일한 문자 두 개가 나올 때마다 지우는 걸 반복해서 해결했는데
문자열 길이가 최대 100만이고 for문을 한 번만 돌고 있는데 어디서 시간 초과가 나는 걸까 생각해봤더니 string 헤더의 erase 함수가 문제였다.
erase
의 함수의 시간복잡도가 O(N)
이라서 결국 이중 for문을 도는 것과 마찬가지였던 것...
스택
을 사용하면 정말 빠르고 쉽게 풀 수 있었다.
문자열의 원소를 스택에 집어넣을 때마다 스택의 top
원소와 비교해서 동일하면 스택을 pop하고, 아니면 스택에 push 하면 된다.
모든 문자에 대해 위의 과정을 거치고 스택에 남아있는 게 있다면 모두 제거가 불가능한 상태이므로 0을 출력하고, 그게 아니라면 1을 출력하면 된다.
코테에서도 문자열에 스택 써야되는 경우를 종종 본 것 같다.
내 코드
// [12973] 짝지어 제거하기
/*
string erase의 시간 복잡도: O(N)
-> 매번 지우는 방식으로 하면 100만*100만으로 시간초과
*/
#include <iostream>
#include <string>
#include <stack>
using namespace std;
int solution(string s)
{
stack<char> st;
for(char c: s) {
if(!st.empty() && st.top() == c) {
st.pop();
}
else {
st.push(c);
}
}
if(st.empty()) return 1;
else return 0;
}
'프로그래머스 > 문자열' 카테고리의 다른 글
2022 KAKAO TECH INTERNSHIP 성격 유형 검사하기(C++) (0) | 2022.09.23 |
---|---|
[프로그래머스] 문자열을 숫자로 (0) | 2020.02.06 |