[프로그래머스] 2019 카카오 개발자 겨울 인턴십 - 크레인 인형 뽑기 게임 (JAVA)

·2023년 1월 24일
0

프로그래머스

목록 보기
28/59

📌 문제 설명

앞부분 생략
게임 화면의 격자의 상태가 담긴 2차원 배열 board와 인형을 집기 위해 크레인을 작동시킨 위치가 담긴 배열 moves가 매개 변수로 주어질 때, 크레인을 모두 작동시킨 후 터트려져 사라진 인형의 개수를 return 하도록 solution 함수를 완성해 주세요.

📌 제한 사항

  • board 배열은 2차원 배열로 크기는 "5 x 5" 이상 "30 x 30" 이하입니다.
  • board의 각 칸에는 0 이상 100 이하인 정수가 담겨있습니다.
  • 0은 빈 칸을 나타냅니다.
  • 1 ~ 100의 각 숫자는 각기 다른 인형의 모양을 의미하며 같은 숫자는 같은 모양의 인형을 나타냅니다.
  • moves 배열의 크기는 1 이상 1,000 이하입니다.
  • moves 배열 각 원소들의 값은 1 이상이며 board 배열의 가로 크기 이하인 자연수입니다.

📌 입출력 예

boardmovesresult
[[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,5,3,5,1,2,1,4]4

📌 코드

import java.util.*;

class Solution {
    public int solution(int[][] board, int[] moves) {
       int answer = 0;
       Stack <Integer> stack = new Stack<>();
        for(int i = 0; i < moves.length; i++){
            for(int j = 0; j < board.length; j++){
                if(board[j][moves[i]-1] != 0) {
                    if(stack.empty() || stack.peek() != board[j][moves[i]-1])
                        stack.add(board[j][moves[i]-1]);
                    else if(stack.peek() == board[j][moves[i]-1]){
                        answer += 2;
                        stack.pop();
                    }
                    board[j][moves[i]-1] = 0;
                    break;
                }
            }
        }
       return answer;
    }
}

📌 문제 해결 과정

💡 뽑은 인형들을 저장하기 위한 것으로 스택을 사용하였다 -> 맨 위에 있는 인형(정수)을 제거하기에 용이하기 때문에 ❕

💡 move 배열에 담긴 원소의 순서대로 격자 칸에 가야 하는데, 해당 격자 칸의 수가 0이 아닐 때, 즉 인형이 있는 경우에 스택이 빈 상태이거나 스택의 맨 위에 있는 원소가 추가하려는 정수와 같지 않다면 스택에 push를 해 주면 된다 하지만, 스택이 비지 않았으며 스택의 top에 있는 원소와 추가하려는 정수가 같다면 두 개의 인형이 터지게 되며 answer에 +2를 해 주고, top에 있는 정수를 pop 해서 없어지게 해 주었다 이후 격자 칸에서 인형을 처리한 자리에는 0으로 빈칸으로 표시해 주며 한 칸에서 인형을 뽑았으면 더 뽑을 수 없으므로 break로 해당 반복문을 멈추고 move 배열의 원소에 따라 다음 칸으로 갈 수 있게 해 준다

풀기 전엔 좀 막막해 보였는데 생각보다 빨리 풀린 문제 🤩

profile
공부는 많은 양을 하진 않더라도 꾸준히 매일 하기

0개의 댓글