STUDY/코딩테스트 연습(PS)

프로그래머스/크레인 인형뽑기 게임/2019 카카오 개발자 겨울 인턴십/C++

hyunah 2021. 4. 9. 08:36

문제 이미지

문제 설명

: 왼쪽의 보드에서 각 컬럼의 맨 위에 있는 인형을 집어 오른쪽의 바구니로 옮기는 과정을 실시한다. 오른쪽 바구니의 격자 아래칸부터 차곡차곡 쌓이게 된다. 이때 오른쪽 바구니에서 같은 모양이 두 개가 겹쳐지면 두 인형은 떠뜨려지면서 사라진다. 인형이 집어지지 않는 경우는 없고, 인형이 없는 곳에서 크레인 작동시키는 경우에는 아무 일도 일어나지 않는다. 오른쪽의 바구니는 모든 인형이 들어갈 수 있을 만큼 충분히 크다. 

 

 

오른쪽의 바구니를 스택으로 구현하여 스택의 top 원소와 집어넣고자 하는 원소의 값이 일치하면 스택을 pop하는 방식으로 풀면 된다. 스택을 이용하는 간단한 문제.

 

 

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

using namespace std;

int push(stack<int> &s, int item){
    if(!s.empty() && s.top() == item) {
        s.pop();
        return 2;
    }

    s.push(item);
    return 0;
}

int solution(vector<vector<int>> board, vector<int> moves) {
    stack<int> basket;
    int answer = 0;

    for(int i = 0; i<moves.size(); i++){
        int x = moves[i]-1;
        for(int j = 0; j<board[x].size(); j++){
            if(board[j][x] != 0) {
                answer += push(basket,board[j][x]);
                board[j][x] = 0;
                break;
            }
        }

    }

    return answer;
}

 

 

 

피드백

: push 함수를 따로 생성하여 스택의 최상단 원소와 넣으려는 원소의 값을 비교한 후 동일하면 pop 시킨 후 2를 반환하고, 동일하지 않거나 스택이 비어있으면 그냥 새로운 원소를 push하고 0을 반환하도록 하였는데, push라고 함수명을 설정한 게 조금 신경쓰인다. 실제로는 push되는 원소의 개수가 아니라 pop되는 원소의 개수를 반환하는 것이므로.. 함수를 정의할 때는 이런 부분을 좀 신경쓰자~~ 사실 함수로 따로 빼지 않았어도 됐을 거 같긴 하다.