import java.util.*;
class Solution {
public int solution(int[][] board, int[] moves) {
int answer = 0;
/*
[
[0,0,0,0,0],
[0,0,1,0,3],
[0,2,5,0,1],
[4,2,4,4,2],
[3,5,1,3,1]
]
위와 같은 구조임
*/
//stack에 넣고 pop answer + 2 하면 됨
//e.g. 1번 열은 각 배열의 인덱스 0임
//for문이 배열들을 돌면서 인덱스 0만 보는 구조임
Stack<Integer> stack = new Stack<>();
for(int i=0; i < moves.length; i++){
int pick = moves[i] - 1;
for(int j=0; j < board.length; j++){
int number = board[j][pick];
if(number != 0){
if(stack.empty()){
stack.push(number);
board[j][pick] = 0;
break;
}else if(stack.peek() == number){
stack.pop();
board[j][pick] = 0;
answer += 2;
break;
}else{
stack.push(number);
board[j][pick] = 0;
break;
}
}
}
}
return answer;
}
}
분석
단순한 이차원 배열 문제 였음
문제 설명의 부족으로 인해서 2차원 구조를 잘 못 이해하여 아래와 같은 다른 코드를 작성하였음.
문제 설명 부족으로 인해 작성된 오답
/*
[
[0,0,0,0,0],
[0,0,1,0,3],
[0,2,5,0,1],
[4,2,4,4,2],
[3,5,1,3,1]
]
위와 같은 구조이지만 문제의 설명이 부족하여 배열 1개가 1라인인줄 알고 아래와 같이 풀었음.
*/
import java.util.*;
class Solution {
public int solution(int[][] board, int[] moves) {
int answer = 0;
/*
스택
같은 인형 2개 없어짐
아무것도 없는 곳은 동작 x
스택크기는 무제한
board 2차원 배열 - 숫자들 - 같은 숫자들 2개 스택에 담기면 사라짐
0은 빈칸 / 배열에 0이 있어도 아래부터 차곡차곡 쌓여있다.
moves 는 pick 위치들
동일 숫자가 2개 되어 없어진 숫자들의 개수 return
*/
//우선 board를 아래서부터 정리
for(int i = 0; i < board.length; i++){ //1차원 배열을 빼서
int [] tempArr = new int[board[i].length]; //초기화시 모두 0
int tempIndex = 0;
for(int j = 0; j < board[i].length; j++){
if(board[i][j] != 0){ //0이 아닌 경우만 담는다.
tempArr[tempIndex] = board[i][j];
tempIndex++;
}
}
board[i] = tempArr; //board의 배열 교환
}
//바구니는 stack으로
Stack<Integer> stack = new Stack<>();
//뽑았을 때 비어있는 곳이 아니면 해당 숫자를 stack에 push
//moves를 하나씩 돌면서 board의 해당 열에서 하나씩 스택으로 가져가고 가져간 자리는 0으로 만든다.
for(int i = 0; i < moves.length; i++){
int pick = moves[i] - 1;
// System.out.println("pick : " + pick);
//board에서 고른 열을 역순으로 돌면서 0이 아닐때 빼서 스택에 push
//하고나서 다음 무브
for(int j = board[pick].length - 1; j>=0; j--){
int nowNumber = board[pick][j];
// System.out.println(nowNumber);
//4,3,2,1,0
if(nowNumber != 0){
//여기서 같은 숫자가 들어왔는지 체크하고 answer++
if(stack.empty()){
stack.push(nowNumber);
board[pick][j] = 0;
break;
} else if(stack.peek() != nowNumber){
stack.push(nowNumber);
board[pick][j] = 0;
break;
} else{ //스택에 동일한 숫자 2개가 들어감.
board[pick][j] = 0;
stack.pop();
answer += 2;
// System.out.println("여기서 2개 제거 : "+answer);
break;
}
}
// System.out.println("stack : " + stack);
}
}
return answer;
}
}