-
[프로그래머스 Level1][Java] 크레인 인형뽑기 게임Coding Test/Programmers 2021. 12. 8. 20:13
크레인 인형뽑기 게임
- 크레인을 통해 인형을 뽑고 바구니에 담았을 때 같은 인형일 경우 떠트려져서 사라진다.
이 때, 터트려져서 사라진 인형의 개수를 리턴하는 문제
※ 생각하기
- 인형을 뽑게되면 아래서부터 차곡차곡 쌓이고 같은 인형이면 위에서부터 터져서 사라짐
→ Stack 구조
- 어떻게 뽑아야할지 고민하기
- 내가 뽑아야 하는 규칙 또는 방법
* --------------------------------------------------------------------
* moves[0] == 1 -> board[0~4][0] -> board[0~4][moves[0] - 1]
* moves[1] == 2 -> board[0~4][1] -> board[0~4][moves[1] - 1]
* moves[2] == 3 -> board[0~4][2] -> board[0~4][moves[2] - 1]
* moves[3] == 4 -> board[0~4][3] -> board[0~4][moves[3] - 1]
* moves[4] == 5 -> board[0~4][4] -> board[0~4][moves[4] - 1]
* ---------------------------------------------------------------------
※ 풀이법
1) Stack 객체 생성
2) 2차원 배열(board)를 이중 for문으로 돌리면서 크레인이 뽑는 위치에 인형이 있는 경우와 아닌 경우를 조건로 하여
로직을 구현한다.
2-1) 크레인이 뽑는 위치에 인형이 있는 경우(board[j][moves[i] - 1] != 0)
- isEmpty()로 Stack이 비어있는지 확인하고 비어있을 경우 인형을 push()로 인형을 넣어준다
- Stack이 비어있지 않으면 peek()로 Stack에 들어있는 인형과 뽑아온 인형을 비교하여 같을 경우
pop()로 뽑아온 인형과 이미 있었던 인형을 삭제해주고 answer에 2(터진 인형 개수)를 더해준다.
만약, 뽑아온 인형과 존재하는 인형이 다를 경우 push()로 쌓아준다.
3) 인형을 뽑아온 위치의 값을 0으로 바꿔준다.
문제를 읽고 Stack을 활용해야 한다고 바로 파악했다.
다만, Stack의 기본적인 개념만 알고 있었기에 Stack 함수에 대해 공부하여 로직을 구현했다.
Stack에 빠삭하다면 매우 쉬운 문제라고 생각함!




01234import java.util.Stack; /** * 2021-1207 * 프로그래머스 level1 : 크레인 인형뽑기 게임 */ public class Solution { // 결과 확인을 위함 public static void main(String[] args) { Solution st = new Solution(); 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(st.solution(board, moves)); } public int solution(int[][] board, int[] moves) { /* moves와 board의 규칙 * ------------------------------------------------------------- * moves[0] == 1 -> board[0~4][0] -> board[0~4][moves[0] - 1] * moves[1] == 2 -> board[0~4][1] -> board[0~4][moves[1] - 1] * moves[2] == 3 -> board[0~4][2] -> board[0~4][moves[2] - 1] * moves[3] == 4 -> board[0~4][3] -> board[0~4][moves[3] - 1] * moves[4] == 5 -> board[0~4][4] -> board[0~4][moves[4] - 1] * ------------------------------------------------------------- */ int answer = 0; Stack<Integer> stack = new Stack<Integer>(); for(int i=0; i<moves.length; i++) { for(int j=0; j<board.length; j++) { if(board[j][moves[i] - 1] != 0) { // 1. stack이 비었으면 if(stack.isEmpty()) { // 1-1. 뽑은 인형 넣기 stack.push(board[j][moves[i] - 1]); // 2. stack이 비어있지 않으면 }else { // 2-1. 가장 최근에 들어온 인형과 뽑아온 인형이 같을 때 if(stack.peek() == board[j][moves[i] - 1]) { // 2-1-1. 인형 제거 stack.pop(); // 2-1-2. 같으면 인형 2개가 사라지므로 answer 2 더하기 answer += 2; // 2-2. 가장 최근에 들어온 인형과 뽑아온 인형이 다를 때 }else { // 2-2-1. 인형 그대로 넣기 stack.push(board[j][moves[i] - 1]); } } // 3. 인형 뽑은 자리 0으로 만들기 board[j][moves[i] - 1] = 0; break; } } } return answer; } }'Coding Test > Programmers' 카테고리의 다른 글
[프로그래머스 Level2][Java] N개의 최소공배수 (0) 2021.12.09 [프로그래머스 Level1][Java] 다트 게임 (0) 2021.12.08 [프로그래머스 Level1][Java] 실패율 (0) 2021.12.08 [프로그래머스 Level1][Java] 신규 아이디 추천 (0) 2021.12.08 [프로그래머스 Level1][Java] 비밀지도 (0) 2021.12.08