알고리즘/프로그래머스 1단계

프로그래머스 - 크레인 인형뽑기 게임 - C++

게임만드는학생 2024. 7. 25. 15:06

https://school.programmers.co.kr/learn/courses/30/lessons/64061

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

#include <string>
#include <vector>
#include <stack>
using namespace std;

int solution(vector<vector<int>> board, vector<int> moves) {
    int answer = 0;
    stack<int> s;
    vector<int>arr(board.size(), 0);
    for (int i = 0; i < arr.size(); i++)
    {
        for (int j = 0; j < arr.size(); j++)
        {
            if (board[j][i] != 0)
            {
                arr[i] = j;
                break;
            }
        }
    }
    for (int i = 0; i < moves.size(); i++)
    {
        moves[i]--;
        if (arr[moves[i]] == board.size())continue;
        int cur = board[arr[moves[i]]][moves[i]];
        if (cur != 0)
        {
            if (s.empty())
                s.push(cur);
            else
            {
                if (s.top() == cur)
                {
                    s.pop();
                    answer += 2;
                    
                }
                else
                    s.push(cur);
            }
            arr[moves[i]]++;
        }
    }
    return answer;
}

 

인형의 종류가 2차원벡터인 board로 주어지고 크레인이 움직인 위치가 moves로 주어진다. 

뽑은 인형은 바구니에 하나씩 쌓인다 가정하며 같은 종류 2개가 쌓이면 터지며 +2점이 된다.

이 때, 얻은 점수를 리턴하는 문제이다.

 

먼저 arr 벡터에 board에서 각 줄에서 가장 위에있는 인덱스를 저장한다. 

arr 벡터를 통해 한번에 크레인이 뽑을 위치에 접근한다.

 

for (int i = 0; i < moves.size(); i++)
    {
        moves[i]--;
        if (arr[moves[i]] == board.size())continue;
        int cur = board[arr[moves[i]]][moves[i]];
        if (cur != 0)
        {
            if (s.empty())
                s.push(cur);
            else
            {
                if (s.top() == cur)
                {
                    s.pop();
                    answer += 2;

                }
                else
                    s.push(cur);
            }
            arr[moves[i]]++;
        }
    }

moves위치에서 하나씩 뽑아서 바구니에 쌓는다. 

moves[i]는 크레인이 움직인 보드의 열에 해당한다.

arr[moves[i]] 는 보드의 열에서 가장 위에있는 인형의 위치에 해당한다.

따라서 board에서 크레인이 움직인 위치의 열에서 가장 위에있는 인형의 위치가 cur에 저장된다.

 

그리고 stack을 통해서 계속 쌓거나 이전값과 cur가 동일하면 같은 인형이므로 +2점 계산한다.