[프로그래머스] 크레인 인형뽑기 게임
Programmers - [2019 카카오 개발자 겨울 인턴십] 크레인 인형뽑기 게임
사용 언어 - C++
소요 시간 - 약 22분
문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/64061
문제 요약
- N * N으로 이루어진 인형 보드에서 인형을 뽑아 바구니에 넣음
- 바구니에 같은 인형이 연달아 있는 경우, 해당 인형 2개를 삭제하고 삭제된 개수 +2
- 최종 삭제된 인형 개수 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이 아닌 경우에만 추가하도록 변경
해결 과정
- 어떤 과정이 우선이 되어야 하는 지를 생각
- 우선이 되어야 하는 순서대로 작성
문제 풀이 후 소감
- 이전에 풀던 문제들보다는 훨씬 수월한 문제였다
- 문제 자체는 쉬웠지만 간단한 것들에서 실수가 나와 생각보다 시간도 걸리고 오류가 많았다
- 조건을 조금 더 꼼꼼하게 살피는 노력이 필요할 듯하다.