https://school.programmers.co.kr/learn/courses/30/lessons/64061#
import java.util.ArrayDeque;
import java.util.Deque;
class Solution {
public int solution(int[][] board, int[] moves) {
import java.util.ArrayDeque;
import java.util.Deque;
class Solution {
public int solution(int[][] board, int[] moves) {
int answer = 0;
Deque<Integer> stack = new ArrayDeque<>();
// moves가 마지막일때까지 반복
// 뽑기 -> 넣기; 동일한 2개면 없애기
// 0은 빈칸 -> 아무일 안생김
// 각 라인별 젤 위에 존재하는 인덱스 값 선택
int[] topIdx = new int[board[0].length];
for(int i=0;i<board[0].length;i++){
for(int j=0;j<board.length;j++){
if(board[j][i] !=0){
topIdx[i] = j;
break;
}
}
}
// for(int a : topIdx)
// System.out.println(a);
for(int i=0;i<moves.length;i++){
int now = board[topIdx[moves[i]-1]][moves[i]-1]; // 넣으려고 하는 값
if(now == 0) continue; // 바닥 혹은 넣을 게 없다라는 의미
// 뽑은 걸로 처리하기
board[topIdx[moves[i]-1]][moves[i]-1] = 0;
if(topIdx[moves[i]-1] < board.length-1) topIdx[moves[i]-1]++;
// stack 젤 위에 값이 넣으려고 하는 값과 동일한지 비교
// 동일하면 stack에서 값 빼기, 다르면 stack에 넣기
if(!stack.isEmpty() && stack.peek() == now){
stack.pop();
answer += 2;
}else{
stack.push(now);
}
}
return answer;
}
}
초기값에 값을 넣는 곳에서 문제가 발생했었음.
열을 기준으로 돌아가도록 작성함으로써 해결 + break
===
다른 답안
import java.util.ArrayDeque;
import java.util.Deque;
public class Solution {
public int solution(int[][] board, int[] moves) {
// 각 열별 스택
Deque<Integer>[] lanes = new ArrayDeque[board.length];
for (int i = 0; i < lanes.length; i++) {
lanes[i] = new ArrayDeque<>();
}
// 스택에 시작 데이터를 넣는다.
for (int i = board.length - 1; i >= 0; i--) { // 배열의 마지막 (맨 밑) 부터
for (int j = 0; j < board[i].length; j++) { // 왼쪽 -> 오른쪽
if( board[i][j] > 0 ) {
lanes[j].push(board[i][j]);
}
}
}
// 바구니 스택
Deque<Integer> bucket = new ArrayDeque<>();
int answer = 0;
for (int move : moves) {
if( ! lanes[move - 1].isEmpty() ) {
int doll = lanes[move - 1].pop(); // 해당 lanes 의 스택에서 인형을 꺼낸다.
if( ! bucket.isEmpty() && bucket.peek() == doll ) {
bucket.pop();
answer += 2;
}else {
bucket.push(doll);
}
}
}
return answer;
}
}
topIndex 설정법 다른 버전
=> 개수를 세려서 확인하기
import java.util.ArrayDeque;
import java.util.Deque;
// 바구니만 스택으로
// 인형 배열을 그대로 사용하고, 각 열의 가장 위 인형의 index 를 배열로 관리
public class Solution {
public int solution(int[][] board, int[] moves) {
int answer = 0;
// 열별 가장 높이 있는 인형의 index 를 관리
int[] col_top_idx = new int[board.length];
// boards 배열을 왼쪽으로 이동하면서 계산
for (int col = 0; col < col_top_idx.length; col++) {
// 맨 꼭대기부터 시작
int top_idx = 0;
while( top_idx < board.length - 1 && board[top_idx][col] == 0 ) {
top_idx++;
}
col_top_idx[col] = top_idx;
}
// 바구니 스택
Deque<Integer> bucket = new ArrayDeque<>();
for (int move : moves) {
// 해당 열에 인형이 없는 경우
if( col_top_idx[move - 1] > board.length - 1 ) continue;
// 해당 열 [][move - 1] 의 가장 높은 위치의 인형의 높이 ( col_top_idx[move - 1] ) 의 인형을 꺼낸다.
int doll = board[ col_top_idx[move - 1] ][move - 1];
col_top_idx[move - 1]++; // 인형을 꺼낸 열의 다음 인형을 가리키도록 1 증가
if( ! bucket.isEmpty() && bucket.peek() == doll ) {
bucket.pop();
answer += 2;
}else {
bucket.push(doll);
}
}
return answer;
}
}