문제
풀이 1
#include <string>
#include <iostream>
using namespace std;
int solution(string s)
{
int answer = 0, i = 0;
while (i < s.length()) {
if (s[i] == s[i + 1]) {
s.erase(i, 2);
i = 0;
}
else i++;
if (s.length() == 0) return 1;
}
return 0;
}
while문으로 푼 풀이이다. 정답은 다 맞혔으나 효율성 테스트를 전혀 통과할 수 없었다.
알파벳이 2개인 짝을 제거할 경우 다시 처음부터 탐색하기 때문에 비효율적일수밖에 없었을 것이다.
풀이 2
#include <string>
#include <iostream>
#include <stack>
using namespace std;
int solution(string s)
{
stack<int> st;
for(int i=0; i<s.length(); i++){
if(!st.empty() && st.top() == s[i]){
st.pop();
}
else st.push(s[i]);
}
return st.empty()?1:0;
}
stack을 사용하면 시간복잡도 O(n)으로 문제를 해결할 수 있다.
스택(Stack)의 멤버함수 정리
멤버함수 | 기능 |
s.push(element) | top에 원소를 추가한다 |
s.pop() | top에 있는 원소를 삭제한다 |
s.top() | top에 있는 원소를 반환한다. (stack에서는 가장 최근에 들어온 원소가 top에 위치한다.) |
s.empty() | 스택이 비어있으면 true를, 그렇지 않다면 false를 반환한다. |
s.size() | 스택의 사이즈를 반환한다. |
s.swap(stack1, stack2) | 두 스택의 내용을 바꿔준다. |
다른 사람 풀이
#include <iostream>
#include<string>
#include <stack>
using namespace std;
int solution(string s)
{
stack<char> c;
int answer = 0;
for(int i=0; i<s.size(); i++){
if(c.size()==0){
c.push(s[i]);
continue;
}
if(c.top() == s[i])
{
c.pop();
}
else{
c.push(s[i]);
}
}
if(c.empty())
answer = 1;
else{
answer = 0;
}
return answer;
}
https://twpower.github.io/75-how-to-use-stack-in-cpp
'Algorithm > Programers - C++' 카테고리의 다른 글
[프로그래머스] 해시 - 전화번호 목록 (0) | 2022.06.21 |
---|---|
[프로그래머스] 행렬 테두리 회전하기 (0) | 2022.04.09 |
[프로그래머스] 깊이/너비 우선 탐색(DFS/BFS) - 타겟 넘버 (0) | 2022.03.27 |
[프로그래머스] 힙(Heap) - 더 맵게 / 우선순위큐(priority_queue) (0) | 2022.03.23 |
[프로그래머스] 스택/큐 - 기능개발 (0) | 2022.03.19 |