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

AI·2025년 9월 8일

https://school.programmers.co.kr/learn/courses/30/lessons/64061#

import java.util.ArrayDeque;
import java.util.Deque;

class Solution {
    public int solution(int[][] board, int[] moves) {
import java.util.ArrayDeque;
import java.util.Deque;

class Solution {
    public int solution(int[][] board, int[] moves) {
        int answer = 0;
        Deque<Integer> stack = new ArrayDeque<>();
        // moves가 마지막일때까지 반복
        // 뽑기 -> 넣기; 동일한 2개면 없애기
        // 0은 빈칸 -> 아무일 안생김
        
        // 각 라인별 젤 위에 존재하는 인덱스 값 선택
        int[] topIdx = new int[board[0].length]; 
        for(int i=0;i<board[0].length;i++){
            for(int j=0;j<board.length;j++){
                if(board[j][i] !=0){
                    topIdx[i] = j;
                    break;
                }
            }
        }
        // for(int a : topIdx)
        //     System.out.println(a);
        
        for(int i=0;i<moves.length;i++){
            int now = board[topIdx[moves[i]-1]][moves[i]-1]; // 넣으려고 하는 값
            if(now == 0) continue; // 바닥 혹은 넣을 게 없다라는 의미
            
            // 뽑은 걸로 처리하기
            board[topIdx[moves[i]-1]][moves[i]-1] = 0; 
            if(topIdx[moves[i]-1] < board.length-1) topIdx[moves[i]-1]++;
            
            // stack 젤 위에 값이 넣으려고 하는 값과 동일한지 비교
            // 동일하면 stack에서 값 빼기, 다르면 stack에 넣기
            if(!stack.isEmpty() && stack.peek() == now){
                stack.pop();
                answer += 2;
            }else{
                stack.push(now);
            }
            
        }
        return answer;
    }
}

초기값에 값을 넣는 곳에서 문제가 발생했었음.
열을 기준으로 돌아가도록 작성함으로써 해결 + break

===
다른 답안

import java.util.ArrayDeque;
import java.util.Deque;
public class Solution {
    
    public int solution(int[][] board, int[] moves) {
        
        // 각 열별 스택
        Deque<Integer>[] lanes = new ArrayDeque[board.length];
        for (int i = 0; i < lanes.length; i++) {
            lanes[i] = new ArrayDeque<>();
        }
        
        // 스택에 시작 데이터를 넣는다.
        for (int i = board.length - 1; i >= 0; i--) { // 배열의 마지막 (맨 밑) 부터
            for (int j = 0; j < board[i].length; j++) { // 왼쪽 -> 오른쪽
                if( board[i][j] > 0 ) {
                    lanes[j].push(board[i][j]);
                }
            }
        }
        
        // 바구니 스택
        Deque<Integer> bucket = new ArrayDeque<>();
        int answer = 0;
        
        for (int move : moves) {
            if( ! lanes[move - 1].isEmpty() ) {
                int doll = lanes[move - 1].pop(); // 해당 lanes 의 스택에서 인형을 꺼낸다.
                
                if( ! bucket.isEmpty() && bucket.peek() == doll ) {
                    bucket.pop();
                    answer += 2;
                }else {
                    bucket.push(doll);
                }
            }
        }
        
        return answer;
    }
}

topIndex 설정법 다른 버전
=> 개수를 세려서 확인하기

import java.util.ArrayDeque;
import java.util.Deque;
// 바구니만 스택으로
// 인형 배열을 그대로 사용하고, 각 열의 가장 위 인형의 index 를 배열로 관리
public class Solution {
    public int solution(int[][] board, int[] moves) {
        
        int answer = 0;
        
        // 열별 가장 높이 있는 인형의 index 를 관리
        int[] col_top_idx = new int[board.length];
        // boards 배열을 왼쪽으로 이동하면서 계산
        for (int col = 0; col < col_top_idx.length; col++) {
            // 맨 꼭대기부터 시작
            int top_idx = 0;
            while( top_idx < board.length - 1 && board[top_idx][col] == 0 ) {
                top_idx++;
            }
            
            col_top_idx[col] = top_idx;
        }
        
        // 바구니 스택
        Deque<Integer> bucket = new ArrayDeque<>();
        
        for (int move : moves) {
            // 해당 열에 인형이 없는 경우
            if( col_top_idx[move - 1] > board.length - 1 ) continue;
            // 해당 열 [][move - 1] 의 가장 높은 위치의 인형의 높이 ( col_top_idx[move - 1] ) 의 인형을 꺼낸다.
            int doll = board[ col_top_idx[move - 1] ][move - 1];
            col_top_idx[move - 1]++; // 인형을 꺼낸 열의 다음 인형을 가리키도록 1 증가
            
            if( ! bucket.isEmpty() && bucket.peek() == doll ) {
                bucket.pop();
                answer += 2;
            }else {
                bucket.push(doll);
            }
        }
        
        return answer;
    }
}

0개의 댓글