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

Updated:

C++

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

문제

게임 화면의 격자의 상태가 담긴 2차원 배열 board와 인형을 집기 위해 크레인을 작동시킨 위치가 담긴 배열 moves가 매개변수로 주어질 때, 크레인을 모두 작동시킨 후 터트려져 사라진 인형의 개수를 return 하도록 solution 함수를 완성해주세요.

문제 출처

접근 방법

먼저 각 크레인의 위치를 하나씩 가져온 뒤, 가져온 크레인 위치에서 위에서 부터 하나씩 내려가며 인형을 찾는다. 인형 발견 시, 바구니에 담는다. 만약 바구니 제일 위의 인형이 현재 뽑은 인형과 같은 인형이면 둘다 제거!

구현

2개의 for문을 이용하여 문제를 해결한다.

  1. 크레인의 위치를 하나씩 가져오는 for
  2. 현재 위치 위에서 부터 내려오는 for 바구니는 st라는 vector를 이용해 표현하였다. 현재 바구니의 제일 위에 있는 인형을 가져오기 위해 vector.back() 함수를 사용하였다.

코드

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int solution(vector<vector<int>> board, vector<int> moves) {
	int answer = 0;
	int curM;
	int size = board[0].size();					//게임 화면은 n x n 이므로 한 변의 크기를 구한다.
	vector<int> st;
	for (int i = 0; i < moves.size(); i++) {	//크레인 동작
		curM = moves[i];						//현재 크레인의 위치
		for (int j = 0; j < size; j++) {		//현재 크레인의 위치의 제일 위부터 하나씩 내려온다
			if (board[j][curM - 1] != 0) {		//내려온 위치의 값이 0이 아니라는 것은 인형이 존재한다는 뜻!
				if (st.empty()) {				//vector가 비어 있을 시 아무 인형도 바구니에 없다는 뜻이므로, 뽑은 인형을 넣는다.
					st.push_back(board[j][curM - 1]);
				}
				else if (st.back() == board[j][curM - 1]) {	//바구니 제일 위의 인형이 현재 뽑은 인형과 같은 것 일때
					st.pop_back();							//바구니의 인형 제거!
					answer += 2;
				}
				else {
					st.push_back(board[j][curM - 1]);
					
				}
				board[j][curM - 1] = 0;			//인형을 뽑았으므로, 0으로 비어있다고 표시
				break;
			}
		}
	}

	return answer;
}

후기 및 개선할 점

15분 vector.back() 메소드 기억!