본문 바로가기

문제 풀이/Programmers

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

문제 출처 - Programmers

문제는 여기

 

코딩테스트 연습 - 크레인 인형뽑기 게임

[[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

programmers.co.kr


[풀이]

1. moves에 해당하는 열의 가장 윗 행에 있는 값을 구한다.

2. 스택의 peek와 1에서 구한 값을 비교해

2-1. 같다면 스택의 값을 pop 하고 값을 2 증가시킨다.

2-2. 다르다면 스택에 넣어준다.

3. 1번에서 구한 값을 0으로 만들어준다.

[접근]

1. 문제를 보고 moves에 해당하는 열의 가장 윗 행에 있는 인형을 뽑는다고 이해를 하였다.

2. 뽑은 인형이 두 번 연속 같은 인형이라면 바구니에 담으며 터진다고 이해하였고 이전에 뽑은 인형을 체크하기 위해서 스택을 사용하면 편하겠다고 생각을 하였다.

[코드]

import java.util.*;

class Solution {
    public int solution(int[][] board, int[] moves) {
        int answer = 0;
        Stack<Integer> st = new Stack<>(); // 뽑은 인형을 담아둘 스택
        
        for (int i = 0; i < moves.length; i++) {
            // moves배열은 1부터 시작하도록 되어있지만 배열은 0부터이므로 -1
            int pos = moves[i] - 1;
            
            // 행의 수만큼 반복
            for (int j = 0; j < board.length; j++) {
                // 해당하는 위치가 0이 아니라면 인형이 있다는 것
                if (board[j][pos] != 0) {
                    // 스택이 비어있지 않고
                    // 스택의 맨 위가 현재 뽑은 인형이라면
                    if (!st.isEmpty() && st.peek() == board[j][pos]) {
                        st.pop(); // 스택의 맨 위를 빼주고
                        answer += 2; // 값을 2증가 (스택에 있던 것 + 이번에 뽑은 것)
                    }
                    else // 위가 다르면 뽑은 인형을 스택에 넣기
                        st.push(board[j][pos]);
                    
                    // 현재 인형을 뽑았으니까 0으로 변경
                    board[j][pos] = 0;
                    break; // 맨 위에 있는 인형만 처리해야하므로 탈출
                }
            }
        }
        
        return answer;
    }
}