-
프로그래머스 - 크레인 인형뽑기 게임 [자바]Algorithms/- 프로그래머스 2022. 1. 30. 22:11
- 문제 링크 : 크레인 인형뽑기 게임
코딩테스트 연습 - 크레인 인형뽑기 게임
[[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 { public int solution(int[][] board, int[] moves) { int answer = 0; /* [ [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] ] 위와 같은 구조임 */ //stack에 넣고 pop answer + 2 하면 됨 //e.g. 1번 열은 각 배열의 인덱스 0임 //for문이 배열들을 돌면서 인덱스 0만 보는 구조임 Stack<Integer> stack = new Stack<>(); for(int i=0; i < moves.length; i++){ int pick = moves[i] - 1; for(int j=0; j < board.length; j++){ int number = board[j][pick]; if(number != 0){ if(stack.empty()){ stack.push(number); board[j][pick] = 0; break; }else if(stack.peek() == number){ stack.pop(); board[j][pick] = 0; answer += 2; break; }else{ stack.push(number); board[j][pick] = 0; break; } } } } return answer; } }
분석
- 단순한 이차원 배열 문제 였음
- 문제 설명의 부족으로 인해서 2차원 구조를 잘 못 이해하여 아래와 같은 다른 코드를 작성하였음.
문제 설명 부족으로 인해 작성된 오답
/* [ [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개가 1라인인줄 알고 아래와 같이 풀었음. */ import java.util.*; class Solution { public int solution(int[][] board, int[] moves) { int answer = 0; /* 스택 같은 인형 2개 없어짐 아무것도 없는 곳은 동작 x 스택크기는 무제한 board 2차원 배열 - 숫자들 - 같은 숫자들 2개 스택에 담기면 사라짐 0은 빈칸 / 배열에 0이 있어도 아래부터 차곡차곡 쌓여있다. moves 는 pick 위치들 동일 숫자가 2개 되어 없어진 숫자들의 개수 return */ //우선 board를 아래서부터 정리 for(int i = 0; i < board.length; i++){ //1차원 배열을 빼서 int [] tempArr = new int[board[i].length]; //초기화시 모두 0 int tempIndex = 0; for(int j = 0; j < board[i].length; j++){ if(board[i][j] != 0){ //0이 아닌 경우만 담는다. tempArr[tempIndex] = board[i][j]; tempIndex++; } } board[i] = tempArr; //board의 배열 교환 } //바구니는 stack으로 Stack<Integer> stack = new Stack<>(); //뽑았을 때 비어있는 곳이 아니면 해당 숫자를 stack에 push //moves를 하나씩 돌면서 board의 해당 열에서 하나씩 스택으로 가져가고 가져간 자리는 0으로 만든다. for(int i = 0; i < moves.length; i++){ int pick = moves[i] - 1; // System.out.println("pick : " + pick); //board에서 고른 열을 역순으로 돌면서 0이 아닐때 빼서 스택에 push //하고나서 다음 무브 for(int j = board[pick].length - 1; j>=0; j--){ int nowNumber = board[pick][j]; // System.out.println(nowNumber); //4,3,2,1,0 if(nowNumber != 0){ //여기서 같은 숫자가 들어왔는지 체크하고 answer++ if(stack.empty()){ stack.push(nowNumber); board[pick][j] = 0; break; } else if(stack.peek() != nowNumber){ stack.push(nowNumber); board[pick][j] = 0; break; } else{ //스택에 동일한 숫자 2개가 들어감. board[pick][j] = 0; stack.pop(); answer += 2; // System.out.println("여기서 2개 제거 : "+answer); break; } } // System.out.println("stack : " + stack); } } return answer; } }
반응형