게임개발자인 "죠르디"는 크레인 인형뽑기 기계를 모바일 게임으로 만들려고 합니다.
"죠르디"는 게임의 재미를 높이기 위해 화면 구성과 규칙을 다음과 같이 게임 로직에 반영하려고 합니다.
게임 화면은 "1 x 1" 크기의 칸들로 이루어진 "N x N" 크기의 정사각 격자이며 위쪽에는 크레인이 있고 오른쪽에는 바구니가 있습니다. (위 그림은 "5 x 5" 크기의 예시입니다). 각 격자 칸에는 다양한 인형이 들어 있으며 인형이 없는 칸은 빈칸입니다. 모든 인형은 "1 x 1" 크기의 격자 한 칸을 차지하며 격자의 가장 아래 칸부터 차곡차곡 쌓여 있습니다. 게임 사용자는 크레인을 좌우로 움직여서 멈춘 위치에서 가장 위에 있는 인형을 집어 올릴 수 있습니다. 집어 올린 인형은 바구니에 쌓이게 되는 데, 이때 바구니의 가장 아래 칸부터 인형이 순서대로 쌓이게 됩니다. 다음 그림은 [1번, 5번, 3번] 위치에서 순서대로 인형을 집어 올려 바구니에 담은 모습입니다.
만약 같은 모양의 인형 두 개가 바구니에 연속해서 쌓이게 되면 두 인형은 터뜨려지면서 바구니에서 사라지게 됩니다. 위 상태에서 이어서 [5번] 위치에서 인형을 집어 바구니에 쌓으면 같은 모양 인형 두 개가 없어집니다.
stack
에 인형이 연속되는 순간 처리를 해야하지만 연속되는 순간 처리하나, 일괄적으로 처리하나 결과는 같습니다.column
이라고 할때 moves에서 가져온 위치의 0이 아닌 숫자를 가져와 list에 담습니다.0
으로 처리해줍니다.import java.util.ArrayList;
import java.util.List;
class Solution {
private int answer = 0;
public int solution(int[][] board, int[] moves) {
List<Integer> stack = getDolls(board, moves);
removeDuplicates(stack);
return answer;
}
boolean isDuplicated(List<Integer> stack) {
boolean result = false;
for(int i = 0; i < stack.size(); i++) {
if(i < 1) continue;
if(stack.get(i) == stack.get(i - 1)) {
result = true;
}
}
return result;
}
void removeDuplicates(List<Integer> stack) {
for(int i = 0; i < stack.size(); i++) {
if(i < 1) continue;
if(stack.get(i) == stack.get(i - 1)) {
answer += 2;
stack.remove(i);
stack.remove(i - 1);
}
}
if(isDuplicated(stack)) removeDuplicates(stack);
else return;
}
List<Integer> getDolls(int[][] board, int[] moves) {
List<Integer> stackList = new ArrayList<Integer>();
for(int line : moves) {
int column = line - 1;
for(int[] boardRow : board) {
if(boardRow[column] != 0) {
stackList.add(boardRow[column]);
boardRow[column] = 0;
break;
}
}
}
return stackList;
}
}