1 분 소요

Question

Q Q2 Q3 Q4


Solution

  • 1번째 라인에서 뽑는다면 [1][0], [1][1], [1][2]과 같이 탐색해서 내려가기때문에 x축과 y축을 뒤집어서 생각해야 한다.
  • 0이 아니면 해당 인형을 다른 vector 공간에 넣고 뽑은 자리를 0으로 바꿔준다.
  • 모두 뽑았으면 인형이 연속되는지 erase()를 통해 제거하되 제거할때마다 처음부터 다시 확인해준다.

Cord

#include <string>
#include <vector>
#include <algorithm>

#define MAX 30

using namespace std;

// 연속된 인형 제거
bool continuousDoll(vector<int>& storage)
{
    int prev = -1;
    for(int i = 0; i < storage.size(); i++)
    {
        if (prev == storage[i])
        {
            storage.erase(storage.begin()+i-1, storage.begin()+i+1);
            return true;
        }
        prev = storage[i];
    }
    return false;
}

// 인형이 있다면 '0이상의 값'을 리턴, 없다면 '0'리턴
int tryGetDoll(vector<vector<int>>& board, int line)
{
    int temp = 0;
    for (int i = 0; i < board[line].size(); i++)
    {
        // 인형이 있다면 뽑아내고 해당 자리를 방문처리 해주기
        if (board[i][line] > 0) 
        { 
            temp = board[i][line];
            board[i][line] = 0;
            return temp; 
        }
    }
    
    return 0;
}

int solution(vector<vector<int>> board, vector<int> moves) 
{
    vector<int> storage;
    int answer = 0;
    
    for(int i = 0; i < moves.size(); i++)
    {    
        // 인형이 0이 아니면 (인형이 해당 라인에 적어도 1개 이상 존재)
        int doll = tryGetDoll(board, moves[i]-1);
        
        if(doll) { storage.push_back(doll); }
    } 
    
    // 연속된 인형 제거
    while(true)
    {
        // 더이상 제거가 이루어지지 않으면 while문을 빠져 나온다.
        if (!continuousDoll(storage)) { break; }
        answer += 2;    // loop가 계속되면 제거가 이루어진 것과 같다. 
    }
    
    return answer;
}

Result

Result