ALGORITHM/프로그래머스 | 백준 | 삼성 | 카카오

[프로그래머스] 2019 카카오 개발자 겨울 인턴십 크레인 인형뽑기 게임

SZCODE 2020. 8. 25. 10:05

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

문제 : 

게임 화면의 격자의 상태가 담긴 2차원 배열 board와 인형을 집기 위해 크레인을 작동시킨 위치가 담긴 배열 moves가 매개변수로 주어질 때, 크레인을 모두 작동시킨 후 터트려져 사라진 인형의 개수를 return 하도록 solution 함수를 완성해주세요.

문제 풀이 :

Stack을 활용해서 풀었습니다.
moves 배열만큼 돌면서 해당하는 숫자 번호를 board 인덱스로 사용해 스택에 넣어주었습니다.

1. 스택이 비어있으면 board 숫자를 넣어주고,
2. 그렇지 않으면 스택의 마지막 요소를 확인합니다.
 2-1. 이때 같으면 스택에서 마지막 요소를 제거해주고 터진 인형 개수를 세줍니다.
 2-2. 같지 않으면 스택에 추가해줍니다.

마지막으로 스택에 넣은 board 숫자는 0으로 만들어줍니다.

몰랐던 점 :
한 번에 처리하려고 하지말자.
import java.util.Stack;

class Solution {
	static Stack<Integer> stack = new Stack();
	static int answer = 0;
	static int remember = 0, last = 0;

	public int solution(int[][] board, int[] moves) {

		for (int i = 0; i < moves.length; i++) {
			for (int j = 0; j < board.length; j++) {

				int x = board[j][moves[i] - 1];

				if (x != 0) {
					if (stack.isEmpty()) {//스택이 비어있으면 추가
						stack.add(x);
					} else {//스택이 비어있지 않으면
						if (stack.peek() == x) {//마지막 요소를 확인해서 x 와 같으면
							stack.pop();//마지막 요소 제거 
							answer += 2;//터트린 인형 개수 세주기
						} else {//마지막 요소와 다르다면
							stack.add(x);//스택에 추가
						}
					}
					board[j][moves[i] - 1] = 0;
					break;
				}
			}
		}

		System.out.println(answer);
		return answer;
	}

}