JAVA/Algorithm

[프로그래머스/java] 크레인 인형 뽑기

nang. 2020. 10. 21. 23:20
반응형
SMALL

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

 

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

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

 

import java.util.*;
class Solution {
    int answer = 0;
    
    public int solution(int[][] board, int[] moves) {
        Stack<Integer> stack = new Stack<>(); // Stack으로 옮겨질 바구니를 만든다
        
        int depth = board.length; // 인형뽑기 바구니의 깊이(depth)를 구한다
        
        for(int i = 0; i < moves.length; i++) { // 옮기는 수인 moves 만큼 인형을 뽑는다
            int c = moves[i] - 1; // 배열은 본디 0부터 시작하고 인형뽑기는 1부터 시작하므로 -1 해준다 편하려고
            
            for(int j = 0; j < depth; j++) {
                if(board[j][c] == 0) { // 0 이라는건 인형 없다는 뜻이니까 패스
                    continue; // 다음 숫자 반복
                } else { // 인형이 있는 경우
                    basketReset(stack, board[j][c]); // 옮겨질 바구니에 인형 넣는 함수에다가 현재 값을 넣어줄 것
                    board[j][c] = 0; // 인형 뽑았으니까 0으로 바꾸기
                    break; // 주어진 move 였던 c가 한번 옮겨짐으로써 끝났으니까 break
                }
            }
        }
        
        return answer * 2;
    }
    
    public void basketReset(Stack<Integer> stack, int current) {
        if(stack.isEmpty()) { // 만약에 스택(바구니)이 비었다면
            stack.add(current); // 그냥 현재 인형을 스택에 넣어줌
            return;
        }
        
        // peek() 스택의 제일 상단에 있는 즉 제일 마지막으로 저장된 요소 반환
        if(stack.peek() == current) { // 스택에 있는 마지막 인형과 현재 넣은 인형이 같다면
            stack.pop(); // 안넣고 마지막 인형을 삭제함 그러면 둘 다 없애는 꼴
            answer++; // 한번 터트림 == 2개가 없어졌다는 의미 (나중에 *2 해야해)
            return;
        } else { // 스택의 마지막 인형이랑 현재 넣을 인형이 다르면 그냥 인형 넣어줌
            stack.add(current);
        }
    }
}
반응형
LIST