본문 바로가기
알고리즘 문제

[알고리즘문제] 프로그래머스 - 크레인 인형뽑기 게임

by 박연호의 개발 블로그 2020. 8. 27.

일단 풀긴 풀었는데, 사소한거에서 실수를 했다. y축을 뒤집어서 입력받으려고 했는데, x,y변수 값을 잘못 세팅했고, 총 제거된 인형수를 구해야 하는데 총 제거된 횟수를 출력했다. 매번 문제를 꼼꼼하게 읽는다고 생각하는데 실수한다..

 

문제 자체는 간단한 것 같다. 나는 y축을 뒤집어서 입력받았기 때문에 stack을 사용했는데 생각해보면 그냥 y축을 뒤집지 않고 que를 사용해도 될 것 같다. 

 

vector<stack<int>> vec를 선언해놓고 각 열에 인형들을 넣어놓았다. 하나씩 꺼내면서 바구니에 넣기 전 안의 값과 비교해서 같으면 count++, top 제거해주고 아니면 그냥 넣었다.

 

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

using namespace std;

int solution(vector<vector<int>> board, vector<int> moves)
{

    vector<stack<int>> vec;
    stack<int> temp; // 바구니
    int answer = 0;

    int size = board[0].size() - 1;

    for (int y = 0; y <= size; y++)
    {
        stack<int> s;
        for (int x = size; x >= 0; x--)
        {
            if (board[x][y] == 0)
            {
                continue;
            }
            s.push(board[x][y]);
        }
        vec.push_back(s);
    }

    for (int i = 0; i < vec.size(); i++)
    {
        stack<int> s = vec[i];
        while (!s.empty())
        {
            cout << s.top() << " ";
            s.pop();
        }
        cout << "\n";
    }

    for (int i = 0; i < moves.size(); i++)
    {
        int pick = moves[i] - 1; // 라인

        if (vec[pick].empty()) // 라인에 인형이 존재하지 않으면 pass
        {
            continue;
        }
        int num = vec[pick].top(); // 라인의 인형 번호
        vec[pick].pop();           // 라인에서 인형 제거
        if (temp.empty())          // 바구니가 비어있는 경우
        {
            temp.push(num);
        }
        else // 바구니에 인형이 있는 경우
        {
            if (temp.top() == num) // 바구니의 값과 넣으려는 값이 같다면
            {
                answer++;
                temp.pop();
            }
            else // 바구니의 값과 넣으려는 값이 다르면
            {
                temp.push(num);
            }
        }
    }
    return answer * 2;
}