[프로그래머스] 크레인 인형뽑기 게임

진예·2024년 1월 6일
0

Programmers

목록 보기
45/45
post-thumbnail

📌 문제

Lv1. 크레인 인형뽑기 게임

문제가 너무 길어서 생략,,

✔️ 제한사항

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

✏️ 입출력

  1. 입출력 예 #1 : 인형의 처음 상태는 문제에 주어진 예시와 같습니다. 크레인이 [1, 5, 3, 5, 1, 2, 1, 4] 번 위치에서 차례대로 인형을 집어서 바구니에 옮겨 담은 후, 상태는 아래 그림과 같으며 바구니에 담는 과정에서 터트려져 사라진 인형은 4개 입니다.

💡 코드

처음에 문제를 잘못 이해해서 각 행에 해당하는 배열이 한 칸에 들어간 인형의 종류인 줄 알고 풀었는데.. 제출만 하면 자꾸 다 실패하는거임.. 테스트 케이스는 통과했는데.. 알고보니 각 행이 말 그대로 격자의 한 행이였던거임 ^^.. 분명 처음 이해한대로 테스트 케이스 풀었을 때 답이 나왔는데 말이죠.. 저거 땜에 거의 한 시간을 고민한게 너무.. 킹받는다..

게임판의 가로 크기n에 저장하고, 크기가 n배열 cnt를 선언하여 각 칸에 들어있는 인형의 개수를 저장해주었다.

인형을 꺼낸 순서대로 바구니에 넣는데, 가장 마지막에 넣은 인형현재 넣을 인형이 같으면 깨야 하므로 마지막에 넣은 인형을 꺼내기 편하게 바구니스택 s로 구현하였다.

인형을 뽑을 칸(열) idxmoves[i]-1이고, 해당 칸에서 뽑혀야 할 인형의 위치(행)cnt[n-idx]이다. 이때, cnt[idx] = 0인 경우에는 뽑을 인형이 없으므로 continue를 통해 건너뛴다.

바구니가 비어있거나 마지막에 넣은 인형이 현재 넣을 인형 crane과 다른 경우에는 인형을 바구니에 넣고, 마지막에 넣은 인형이 crane과 같으면 바구니에서 마지막에 넣은 인형을 꺼내고 깨진 인형의 개수 answer를 2 증가시킨다. (꺼낸 인형 + 넣을 예정이였던 인형) 해당 과정을 모두 수행했다면 인형은 이번 차례에 사용된 것이므로 cnt[idx]--를 수행한다.

import java.util.*;
class Solution {
    public int solution(int[][] board, int[] moves) {
        
        int n = board.length;
        int[] cnt = new int[n];
        
        for(int i=0;i<n;i++) {
            for(int j=0;j<n;j++) {
                if(board[i][j] != 0) cnt[j]++;
            }
        }
        
        Stack<Integer> s = new Stack<>();
        int answer = 0;
        
        for(int i=0;i<moves.length;i++) {
            int idx = moves[i] - 1;            
            if(cnt[idx] <= 0) continue;
            
            int crane = board[n-cnt[idx]][idx];
            
            if(s.empty() || s.peek() != crane) s.push(crane);
            else {
                s.pop(); answer += 2;
            }

            cnt[idx]--;
        }
        return answer;
    }
}

profile
백엔드 개발자👩🏻‍💻가 되고 싶다

0개의 댓글