ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 프로그래머스 - 크레인 인형뽑기 게임 [자바]
    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;
        }
    }

     

    반응형

    댓글

Designed by Tistory.