List 안에 Stack 을 사용하여 풀면 더 쉬울 것 같은데 그러한 방법이 있는지 모르겠어서 기존의 형시대로 풀이를 진행했다.
-
📚 Process
초기화 및 선언
: 뽑을 인형들을 넣을 backet(stack) 과 주어진 보드 데이터들을 담을 doll(ArrayList[]), 많이 사용되는 보드의 사이즈와답을 도출할 ans 라는 변수를 선언한다. 그리고 마지막 board 에 담긴 데이터부터 밑에 위치되어 있기 때문에 끝의 데이터부터 루프를 돌아 doll 변수에 데이터를 할당한다. (0은 빈칸이기 때문에 continue)
인형 뽑기
: pickDoll 이라는 메서드에 구현했다. 배열의 0번째 index부터 데이터가 있기 때문에 -1 을 해준다.
뽑을 인형이 있는지 확인할 수 있는 possible 메서드를 만들었다. 뽑을 수 있다면 뽑고 기존의 데이터를 삭제한다.
(이 부분이 번거로워서 Stack 을 활용하고 싶었다.)
뽑은 데이터를 backet (stack) 과 참조하고 이후 로직을 진행하며 cnt 를 늘려가면 된다.
✅ 전체 코드
: 카카오의 코딩테스트 문제라 겁을 많이 먹고 시작했지만 생각보다 어렵진 않고 구현이 귀찮았던 문제, 더 좋은 풀이가 있다면 댓글로 남겨주시면 감사하겠습니다. : )
import java.util.*;
class Solution {
// 바구니에 담길 Stack
static Stack<Integer> backet = new Stack<>();
static ArrayList<Integer>[] doll;
static int boardSize, cnt;
public int solution(int[][] board, int[] moves) {
boardSize = board.length;
// 보드 데이터 생성
doll = new ArrayList[boardSize];
for(int i=0; i<boardSize; i++) doll[i] = new ArrayList<>();
// 보드 데이터 입력
for(int i=boardSize-1; i>=0; i--) {
for(int j=0; j<board[i].length; j++) {
if(board[i][j] == 0) continue;
doll[j].add(board[i][j]);
}
}
pickDoll(moves);
return cnt;
}
static void pickDoll(int[] moves) {
for(int index : moves) {
// 0번째 라인부터 시작
index--;
// 뽑을 인형이 있는지 확인
if(!possible(index)) continue;
// 해당 라인에 마지막 인형을 뽑아옴
int pick = doll[index].get(doll[index].size()-1);
// Delete
doll[index].remove(doll[index].size()-1);
// 없으면 insert
if(backet.isEmpty()) {
backet.push(pick);
continue;
}
// 뽑은 것과 직전에 넣은 것이 같다면 삭제
if(backet.peek() == pick) {
backet.pop(); cnt += 2;
}
else {
backet.push(pick);
}
}
}
static boolean possible(int index) {
if(doll[index].size() == 0) return false;
return true;
}
}