이 문제에서는 테스트 1번이 말썽을 부려 오랜 시간 고민을 했다. 인덱스 에러때문에 골치가 아팠는데 잠시 밥을 먹고와서 다시 생각해보니 어디가 틀렸는지 보였다.
if (i == 0) {
i -= 1;
} else {
i -= 2;
}
이 부분에서 i == 0 일때도 -2를 해줘서 i = -1이 되어버린 상황이었던 것이다... (한심)
다른 사람의 풀이를 보니 stack을 활용해 푼 듯 하였다. 알고리즘 풀이를 파이썬으로 시작해서 그런가 stack이든 queue이든 모두 list를 사용하는 것이 습관화되어 이 문제에서도 Arraylist를 활용하였는데, 나처럼 Arraylist를 활용하게되면 basket에 다 채워넣은 다음 반복문을 돌면서 터지게 되는 상황이다.
만약 stack을 이 문제에서 사용한다면 같은 인형 2개가 닿을 때마다 바로 터지는 효과를 줄 수 있기에 게임이라는 목적으로 봤을 때는 stack을 활용하는 것이 훨씬 적절했을 것으로 보인다.
import java.util.*;
class Solution {
public int solution(int[][] board, int[] moves) {
int answer = 0;
List<Integer> basket = new ArrayList<>();
for (int move : moves) {
int pick = picking(board, move - 1);
if (pick != 0) {
basket.add(pick);
}
}
for (int i = 0; i < basket.size() - 1; i++) {
if (basket.get(i) == basket.get(i + 1)) {
basket.remove(i);
basket.remove(i);
answer += 2;
if (i == 0) {
i -= 1;
} else {
i -= 2;
}
}
}
return answer;
}
public static int picking(int[][] board, int move) {
int picked = 0;
for (int i = 0; i < board.length; i++) {
if (board[i][move] != 0) {
picked = board[i][move];
board[i][move] = 0;
return picked;
}
}
return picked;
}
}
Stack을 활용한 홍희표님 외 5분의 풀이입니다.
import java.util.Stack;
class Solution {
public int solution(int[][] board, int[] moves) {
int answer = 0;
Stack<Integer> stack = new Stack<>();
for (int move : moves) {
for (int j = 0; j < board.length; j++) {
if (board[j][move - 1] != 0) {
if (stack.isEmpty()) {
stack.push(board[j][move - 1]);
board[j][move - 1] = 0;
break;
}
if (board[j][move - 1] == stack.peek()) {
stack.pop();
answer += 2;
} else
stack.push(board[j][move - 1]);
board[j][move - 1] = 0;
break;
}
}
}
return answer;
}
}