본문 바로가기

알고리즘

[C++] stack의 top과 pop의 차이

728x90

 

 

프로그래머스에서 알고리즘을 풀던중...

스택을 사용해서 dfs를 구현했다.

 

아래 코드에서 요 부분이 오류가 발생했다.

// 오류가 발생한 부분
tuple<int, int> tp = st.pop();
tie(index, sum) = tp;

// 변경해서 해결한 부분
tuple<int, int> tp = st.top();
tie(index, sum) = tp;
st.pop();

 

pop()을 사용해 빼낸 튜플로는 초기화가 안 되더라...근데 top()은 된다...

파이썬을 쓸 때는 pop()을 사용해서 스택에서 제거함과 동시에 그 element를 반환받았다.

 

https://cplusplus.com/reference/stack/stack/pop/  ⬅︎ 이 사이트를 보면

 

c++에서는 top은 알고 있던 것처럼 스택의 맨 위의 값을 반환하는 것이지만

pop은 스택에서 element를 제거만 할 뿐, 반환값이 none이라고 한다.

 

또, top()은 참조형이라서 아래처럼 작성하는 것도 가능하다.

mystack.top() -= 5;

 

파이썬에 익숙해진만큼 다른 언어들에 대한 공부도 게을리하면 안 되겠다...

 

 

풀었던 문제는 레벨2 - 타겟 넘버

스택보다 재귀 코드가 더 깔끔한 듯

 

코드 전문

#include <string>
#include <vector>
#include <stack>
#include <tuple>

using namespace std;

int solution(vector<int> numbers, int target) {
    int answer = 0;
    tuple<int, int> tup;
    stack<tuple<int, int>> st;
    int index, sum;
    
    tup = make_tuple(-1, 0);
    st.push(tup);
    while (!st.empty()){
        tuple<int, int> tp = st.top();
        tie(index, sum) = tp;
        st.pop();
        
        if(index+1 < numbers.size()){
            tup = make_tuple(index+1, sum+numbers[index+1]);
            st.push(tup);
            tup = make_tuple(index+1, sum-numbers[index+1]);
            st.push(tup);
        }
        else if(index+1 == numbers.size()){
            if(sum == target)
                answer++;
        }
    }
    
    return answer;
}