티스토리 뷰

성공 코드(내 코드)

  • moves의 크기 만큼 for문을 돌며
    • moves 원소의 값에 해당되는 board의 열을 탐색한다. 
      • `이 때 위에서 아래로 탐색하며 0보다 큰 숫자가 발견되면 해당 원소 값을 바구니에 넣고 0으로 만들어준다.
      • 그리고 반복문을 빠져나온다.
    • 바구니 안 원소가 2개 이상인 경우
      • 마지막 원소와 그 앞의 원소를 비교하여 값이 같으면 인형이 터지므로 answer을 2 증가시키고 해당되는 두 원소를 바구니에서 지운다.
#include <string>
#include <vector>

using namespace std;

int solution(vector<vector<int>> board, vector<int> moves) {
    int answer = 0;
    vector<int> basket;
    
    for(int i=0; i<moves.size(); i++){
        int loc=moves[i]-1;
        for(int j=0; j<board.size(); j++){
            if(board[j][loc]>0){
                basket.push_back(board[j][loc]);
                board[j][loc]=0;
                break;
            }
        }
        if(basket.size()>=2){
            int end=basket.size()-1;
            if(basket[end]==basket[end-1]){
                answer+=2;
                basket.erase(basket.begin()+end);
                basket.erase(basket.begin()+end-1);
            }
        }
    }
    
    return answer;
}

 


다른 사람 풀이

  • 스택을 사용한다.
  • moves의 크기만큼 for문을 돌며
    • moves 원소의 값에 해당되는 board의 열을 탐색한다.
      • 이 때 위에서 아래로 탐색하며 해당 원소의 값이 0이 아니면
        • 스택 s가 비어있지 않고 스택 s의 가장 위에 있는 값과 해당 원소의 값이 같으면 스택 s의 원소를 pop하고 answer을 2 증가시킨다.
        • 위의 경우가 아니라면 해당 원소를 스택에 넣어준다.
      • 그리고 해당 원소의 값을 0으로 만들어준다.
      • 이 과정이 끝난 후 반복문을 빠져나온다.
#include <string>
#include <vector>
#include <stack>

using namespace std;

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