[프로그래머스] 크레인 인형뽑기 게임



Programmers - [2019 카카오 개발자 겨울 인턴십] 크레인 인형뽑기 게임




사용 언어 - C++

소요 시간 - 약 22분




문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/64061




문제 요약

  1. N * N으로 이루어진 인형 보드에서 인형을 뽑아 바구니에 넣음
  2. 바구니에 같은 인형이 연달아 있는 경우, 해당 인형 2개를 삭제하고 삭제된 개수 +2
  3. 최종 삭제된 인형 개수 return




최종 코드

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

using namespace std;

int solution(vector<vector<int>> board, vector<int> moves) {
    int answer = 0;
    //인형이 있으면 뽑고
    //없으면 밑에 칸으로
    //뽑은 인형은 바구니로
    //바구니에 같은 인형이 이어져 있으면 두개 삭제
    stack<int> basket;
    
    //좌우로 먼저 움직이기
    for(int move : moves)
    {
        int targetDoll = 0;
        move--;
        
        for(int i = 0; i < board.size(); i++)
        {
            //빈칸이면 건너뛰기
            if(!board[i][move]) continue;
            
            //뽑기
            targetDoll = board[i][move];
            //뽑고 나면 비워주기(꼭)
            board[i][move] = 0;
            break;
        }
        
        //이어진 두개가 같은 인형인 경우
        if(!basket.empty() && basket.top() == targetDoll)
        {
            basket.pop();
            //사라진 인형 개수 추가
            answer += 2;
        }
        else if(targetDoll) //타겟이 0이 아닌 경우
        {
            //바구니에 추가하기
            basket.push(targetDoll);
        }
    }
    
    return answer;
}




트러블 슈팅

  • 바구니가 비었는지 확인하지 않아 segmentation fault가 발생
    • !basket.empty()를 추가하여 해결
  • 해당 위치의 인형을 뽑은 후, 0으로 초기화해주지 않아 같은 인형이 다시 뽑히는 문제 발생
    • 뽑은 후에는 항상 해당 위치를 0으로 초기화
  • 마지막에 바구니에 인형을 추가할 때, 인형이 0인 경우에도 추가하는 문제 발생
    • else를 else if(targetDoll)로 바꾸어 인형이 0이 아닌 경우에만 추가하도록 변경




해결 과정

  1. 어떤 과정이 우선이 되어야 하는 지를 생각
  2. 우선이 되어야 하는 순서대로 작성




문제 풀이 후 소감

  • 이전에 풀던 문제들보다는 훨씬 수월한 문제였다
  • 문제 자체는 쉬웠지만 간단한 것들에서 실수가 나와 생각보다 시간도 걸리고 오류가 많았다
  • 조건을 조금 더 꼼꼼하게 살피는 노력이 필요할 듯하다.