본문 바로가기

코딩 테스트/프로그래머스

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

프로그래머스

2019 카카오 개발자 겨울 인턴십

 

 

프로그래머스

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

programmers.co.kr

[3차] 크레인 인형뽑기 게임

 

문제 정리
1. N*N에 해당하는 칸들로 이루어진 게임 화면이 존재한다.
2. 인형을 뽑을 경우 1줄로 되어 있는 공간에 가장 아래칸부터 차곡차곡 쌓여 올라간다.
3. 인형을 뽑아서 담아두는 공간에 같은 인형이 연속적으로 있을 경우 두인형을 터트리고 공간에서 사라진다.
4. 크레인이 인형을 집지 못하는 경우가 없으며 인형이 없는 곳에서 작동할 경우 아무 일도 일어나지 않는다.
5. 인형을 뽑고 저장하는 공간은 충분한 공간이 존재한다.
6. 매개변수 move는 인형이 뽑기 크레인이 내려가는 줄이며 board는 인형이 존재하는 공간을 배열로 만든 것이다.
7. 최종 같은 인형이 2개 들어와서 터지면서 사라지는 인형의 개수를 구하는 것이다.

 

 

시작하기 전 접근 방법
1.인형을 크레인이 뽑아서 뽑은 인형은 아래부터 차곡차고 쌓여 올라가는 개념이기 때문에 stack을 이용한다.
2. 위에부터 쌓여서 2개가 같을 경우 사라지기 때문에 나중에 들어온 값이 먼저 사라는 상황으로 stack이며
3. 크레인이 내려갈 인덱스는 moves로 주어지지만 배열은 인덱스가 0부터 시작하기 때문에 해당 moves배열 값과 인형이 있는 배열 인덱스를 같게 하기위헤 moves값에서 -1을 하여 계산한다.
4. 반복문을 통해서 확인하며 stack에서 사용하는 메소드를 이용하여 계산한다.
5. 크레인은 아래로만 내려가기 때문에 열값만 확인한다.

 

테스트 예제 값

 

 

1. 뽑을 인형을 저장할 stack을 생성하며 stack에 첫번째 값을 0을 저장한다.
0을 저장하는 이유는 stack.peek을 이용하여 값을 확인할 때 값이 없으면 null로 출력되는 문제를 해결하면서 인형 뽑기에서 뽑은 인형 값은 0이 될 수 없기 때문이다.
Stack<Integer> stack = new Stack<>();
		stack.push(0);

 

 

2. 크레인이 작동하는 moves배열만큼 반복하며 크레인은 아래로만 내려가기 때문에 열만 확인하는 배열을 만들어 이중 배열로 진행한다.
3. 인형이 담아 있는 배열에서 0은 인형이 없고 0이 아닌 경우에는 인형이 존재하는 경우이다.
4. 인형이 존재할 때 stack에 가장 위에 있는 값과 뽑은 인형에 값을 비교하여 같을 경우 stack에서 해당하는 인형을 삭제하고 구해야하는 answer값을 *2를 한다.
5. stack에 같은 인형이 연달아 있지 않다면 인형을 추가만 한다.
5. 뽑은 인형에 자리는 인형이 이제 존재하지 않기 때문에 0으로 변경하며 인형을 뽑았기 때문에 해당 열에서 반복문을 더이상 진행하지 않기 위해 break를 한다.
for (int m = 0; m < moves.length; m++) {
	int line = moves[m] - 1;
	for (int i = 0; i < board.length; i++) {

	if (board[i][line] == 0) {
		continue;
	} else if (board[i][line] != 0) {
		if (stack.peek() == board[i][line]) {
			answer += 2;
			stack.pop();
		} else {
			stack.push(board[i][line]);
		}
		board[i][line] = 0;
		break;
		}
	}
}

 

 

최종 코드
더보기
import java.util.*;

class Solution {
	public int solution(int[][] board, int[] moves) {
		int answer = 0;
		Stack<Integer> stack = new Stack<>();
		stack.push(0);
		for (int m = 0; m < moves.length; m++) {
			int line = moves[m] - 1;
			for (int i = 0; i < board.length; i++) {

				if (board[i][line] == 0) {
					continue;
				} else if (board[i][line] != 0) {
					if (stack.peek() == board[i][line]) {
						answer += 2;
						stack.pop();
					} else {
						stack.push(board[i][line]);
					}
					board[i][line] = 0;
					break;
				}
			}
		}
		return answer;
	}
}