코테 준비

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

우디혜 2020. 10. 19. 16:31

programmers.co.kr/learn/courses/30/lessons/64061

 

코딩테스트 연습 - 크레인 인형뽑기 게임

[[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

 

맨 처음 이 문제를 봤을 때가 기억난다..ㅎㅎ

데이터 구조 배우기도 전에 멋모르고 도전했던 카카오 코테...ㅋ 무참히 깨졌었지...

지금 보니까 쉬운 문제인데 그때는 한숨만 나왔는데ㅋㅋㅋㅋ

취준하면서 나의 무능함을 깨닫고 있는 와중에 이런 느낌.. 나쁘지 않은걸 나.. 헛살진 않았나보다 헛헛😂😂

 

이제 푸는 것 이상으로 효율! 클린 코드!! 노력해야지요

또 한 번의 마일스톤에서 나를 되돌아 봤을 때 성장했구나 느낄 수 있도록 열씸히 살아야지

 

로직

하나의 로직에 과정이 많아서, 먼저 과정을 함수단위로 쪼갠 뒤

각 함수들에 코드를 채워넣었다.

 

stack_basket은 뽑은 인형들을 넣는 스택

heights은 board의 각 column에 인형이 몇 개가 남아있는지를 기록

→ 한 번 만들 때 O(n^2)이 걸리긴 하지만, moves가 길어지면 매번 O(n)만큼 돌아서 찾아야해서 만들었다.

 

큰 로직은 이렇다.

stack 선언 → heights initialize → moves를 순회하며 board에 있는 인형들을 뽑아 stack에 넣어준다 → update stack

 

주의해야할 점은, board에 있는 인형들을 뽑아 stack에 넣어줄 때 해당 move 위치에 인형이 없는 경우도 생각해야하기 때문에 height 길이로 예외 상황을 미리 걸러준다.

 

그리고 update stack에서도, stack의 길이가 1이상이어야 peek()할 수 있으니 .emtpy()로 핸들 해주었다.. 그리고 잊지말자.. pop할 시에는 2가 증가한다.. 1이 아니다 멍충이 디혜야😫

코드

import java.util.*;
class Solution {
    private Stack stack_basket;
    private int[] heights;
    private int answer = 0;
    public int solution(int[][] board, int[] moves) {
        stack_basket = new Stack<Integer>();
        init_heights(board);
        
        for(int num : moves){
            pick_and_drop(board, num);
        }
        return answer;
    }
    
    public void init_heights(int[][] board){
        // initialize heights list
        int board_size = board[0].length;
        heights = new int[board_size];
        
        for(int j = 0; j< board_size; j++){
            for(int i = 0; i< board.length; i++){
                if(board[i][j] != 0){
                    heights[j] = i;
                    break;
                }
            }
        }
    }
    
    public void pick_and_drop(int[][] board, int move){
        int height = heights[move - 1];
        if(height < board.length){
            // check stack and update
            answer += update_stack(board[height][move - 1]);
            // update board list
            board[height][move - 1] = 0;
            // update heights list
            heights[move - 1] += 1;
        }
        
    }
    
    public int update_stack(int new_input){
        // check stack_basket
        if(!stack_basket.empty()){
            // if new_input == top element in the stack, pop both
            if((int) stack_basket.peek() == new_input){
                stack_basket.pop();
                return 2;
            } 
        }
        // o/w push new input on the stack
        stack_basket.push(new_input);
        return 0;
    }
    
    void print_stack(){
        Iterator<Integer> itr = stack_basket.iterator();
        while(itr.hasNext()){
            System.out.print(itr.next() + " ");
        }
        System.out.println(" ");
    }
}