본문 바로가기

컴퓨터/프로그래머스

프로그래머스 - 64061번: 크레인 인형뽑기 게임 [Java]

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

1. 코드

import java.util.*;
class Solution {
    public int solution(int[][] board, int[] moves) {
        int answer = 0;
        List <List<Integer>> BOARD = new ArrayList<>();
        for(int i = 0; i < board.length; i++) {
            List <Integer> temp = new ArrayList<>();
            for(int j = 0; j < board.length; j++) {
                if(board[j][i] != 0)
                    temp.add(board[j][i]);
            }
            BOARD.add(temp);
        }
        
        Stack<Integer> basket = new Stack<>();
        for(int m : moves) {
            if(BOARD.get(m - 1).isEmpty()) continue;
            
            if(basket.isEmpty())
                basket.push(BOARD.get(m - 1).remove(0));
            else if(basket.peek() == BOARD.get(m - 1).get(0)) {
                basket.pop();
                BOARD.get(m - 1).remove(0);
                answer += 2;
            }
            else
                basket.push(BOARD.get(m - 1).remove(0));
        }
        return answer;
    }
}

2. 설명

List <List<Integer>> BOARD = new ArrayList<>();
for(int i = 0; i < board.length; i++) {
    List <Integer> temp = new ArrayList<>();
    for(int j = 0; j < board.length; j++) {
        if(board[j][i] != 0)
            temp.add(board[j][i]);
    }
    BOARD.add(temp);
}

board의 열을 기준으로 List에 추가하여 BOARD 리스트를 초기화해줍니다. board의 값이 0인 아닌 데이터만 저장합니다.

Stack<Integer> basket = new Stack<>();
for(int m : moves) {
    if(BOARD.get(m - 1).isEmpty()) continue;

    if(basket.isEmpty())
        basket.push(BOARD.get(m - 1).remove(0));
    else if(basket.peek() == BOARD.get(m - 1).get(0)) {
        basket.pop();
        BOARD.get(m - 1).remove(0);
        answer += 2;
    }
    else
        basket.push(BOARD.get(m - 1).remove(0));
}

바구니 역할을 할 Stack을 생성한 뒤 moves에 저장된 board의 열 번호에 맞추어 BOARD 리스트에 해당 열에 데이터가 있다면 계속 진행하는데 basket이 비어있다면 board에서 열에 첫 번째로 있는 데이터를 제거한 것을 basket에 push합니다.

basket이 비어있지 않다면 basket의 peek 값과 board의 첫 번째 값이 동일하다면 두 개의 값이 제거되며 answer에는 2 증가됩니다. 만약 동일하지 않다면 basket이 비어있을 때와 같은 동작을 진행합니다.

3. 정리

  1. 스택을 적절하게 사용하자
출처: 프로그래머스 코딩 테스트 연습, 
https://school.programmers.co.kr/learn/challenges