본문으로 바로가기

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

 

카카오 인턴십 문제중에 가장 쉬운문제라고 생각하는 문제이다.

깊게 생각할 필요 없이 차례대로 문제를 읽으면서 해석해야한다.

 

가장 주의할점은, 인형을 뽑으면 그 자리를 0 (뽑은 상태)로 바꿔줘야 한다.

 

1. 먼저 인형이 있는지(0이 아닌지) 확인한다. 

2. 스택이 비어있는 경우와, 비어있지 않은 경우 두가지를 고려한다.

-스택이 비어있는 경우

 ->값을 스택에 넣어준다.

-스택이 비어있지 않은경우

 -> 스택 맨 위(stack.peek()) 의 값과, 방금 뽑은 값이 동일하다면 카운트를 2개 올려준다.

 -> 값이 동일하지 않다면 스택에 넣어준다.

 

3.  인형을 뽑았으니, 값을 0으로 바꿔준다.

 

 

이 문제를 풀면서 터진 인형의 개수를 물어보는게 아니라 터진 횟수를 구하는줄 알고 오래걸렸다.

문제를 끝까지 읽지 않아서 생긴 폐해이다..

 

 

import java.util.Stack;

public class KAKAO인형뽑기 {
	public static void main(String[] args) {

		int[][] board = { { 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 } };
		int[] moves = { 1, 5, 3, 5, 1, 2, 1, 4 };

		System.out.println(solution(board, moves));
	}

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

		int res = 0;
		Stack<Integer> st = new Stack<>();

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

				if (board[j][moves[i] - 1] != 0) {
					if (!st.empty()) { // 스택이 비어있을때
						if (st.peek() == board[j][moves[i] - 1]) { // 피크값과 현재값이 동일하다면 터진다.
							res += 2;
							st.pop();
							

						} else { // 동일하지 않다면 그냥 넣어만 준다.
							st.push(board[j][moves[i] - 1]);
							
						}
					} else {// 스택이 비어있다면
						st.push(board[j][moves[i] - 1]);
					}
					board[j][moves[i] - 1] = 0;
					break;
				}
			}
		}
		return res;
	}
}