크레인 인형뽑기 게임

문제


문제 풀이

해당 문제에서 가장 이해하기 어려웠던건 단순 board의 순서이다. 2차배열로 5개로 주어지는데 낮은 수가 당연히 아래에 쌓일 것이라고 생각하고 접근했는데 결과가 나오지 않아 다시 확인해보니 내림차순으로 불러와야 제대로 문제를 풀 수 있었다. 

 

int[][] board = {{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}};

{3, 5, 1, 3, 1}
{4, 2, 4, 4, 2}
{0, 2, 5, 0, 1}
{0, 0, 1, 0, 3}
{0, 0, 0, 0, 0}

 

board를 제대로 정리 했을 시 위와 같은 모습으로 쌓이게 된다 

 

거기서 basket에 담아주면서 상단에있는 값과 같을 때 사라지게하고 결과 +2를 해주면 되는 문제이다. 


나의 답안

public static int solution(int[][] board, int[] moves) {
    int answer = 0;
    ArrayList<Deque<Integer>> list = new ArrayList<>();
    Deque<Integer> basket = new LinkedList<>();
    for (int i = 0; i < board.length; i++) {
        Deque<Integer> stack = new LinkedList<>();
        list.add(stack);
    }
    for (int i = 0; i < board.length; i++) {
        int idx = 0;
        for (int j = 0; j < board[i].length; j++) {
            list.get(idx++).push(board[i][j]);
        }
    }

    move:for (int i = 0; i < moves.length; i++) {
        int pop = 0;
        while (pop == 0) {
            if (list.get(moves[i]-1).size() == 0) continue move;
            pop = list.get(moves[i]-1).pollLast();
        }
        if (basket.isEmpty()) {
            basket.offerLast(pop);
        } else if (basket.peekLast() == pop) {
            basket.pollLast();
            answer += 2;
        } else {
            basket.offerLast(pop);
        }
    }
    return answer;
}

다른 답안

각 자리마다 자료구조로 담아 두는게 아닌 moves에서 나오는 값을 바로 계산하여 정리하는 식이다. 코드 간소화된 모습으로 괜찮아 보여서 참고하였다.

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;
    }
}

'Programmers 문제풀이 > Lv.1' 카테고리의 다른 글

신규 아이디 추천  (0) 2023.03.24
문자열 나누기  (0) 2023.03.24
[카카오 인턴] 키패드 누르기  (0) 2023.03.24
옹알이 (2)  (0) 2023.03.23
카드 뭉치  (0) 2023.03.23