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;
    }
}

 

반응형