코딩테스트연습/프로그래머스

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

:)jun 2021. 12. 14. 16:13

https://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

스택에 쌓으면서 하나씩 확인해가면서 같은 숫자면 터트리고 터진 인형의 갯수 +=2 해주는걸로 가자!

//테스트코드

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.*;

class Quiz1_CraneDrawingDollsGameTest {
    Quiz1_CraneDrawingDollsGame q;

    @BeforeEach
    void setUp() {
        q = new Quiz1_CraneDrawingDollsGame();
    }

    @Test
    void test1() {
        assertEquals(4, q.solution(new int[][]{{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}}, new int[]{1, 5, 3, 5, 1, 2, 1, 4}));
    }
}

//프로덕션코드

import java.util.Stack;

public class Quiz1_CraneDrawingDollsGame {
    public int solution(int[][] board, int[] moves) {

        int numberOfPopingDolls = 0;
        int lastNumber = -1;
        int newNumber;

        Stack<Integer> stack = new Stack<>();

        for (int move : moves) {
            for (int i = 0; i < board.length; i++) {
                newNumber = board[i][move - 1];

                if (newNumber == 0) {
                    continue;
                }

                if (newNumber == lastNumber) {
                    stack.pop();
                    numberOfPopingDolls += 2;

                    if (stack.size() != 0) {
                        lastNumber = stack.peek();
                    } else {
                        lastNumber = -1;
                    }
                    board[i][move - 1] = 0;
                    break;
                }

                stack.push(newNumber);
                lastNumber = newNumber;
                board[i][move - 1] = 0;
                break;
            }
        }


        return numberOfPopingDolls;
    }
}


// 성공! 사실 이 문제는 풀다가 에러가 많이 났다. continue; break; 를 효율적으로 사용하지 못했다.
// 그리고 인형을 뺐으면 그 자리는 0으로 바꿔줘야하는데 그것까지 생각하지 못했다.
// 문제를 더 유심히 보고 확실히 풀이 과정을 생각한 뒤에 코드 작성을 시작하자! 오히려 더 빠르다!
// 그리고 이 문제는 들여쓰기가 많았는데 디버그 과정에서 내 스스로 보기가 어려워서 중간에 리팩토링을 진행했다.
// 더 깔끔히 할 수 있는지 확인하고 리팩토링하고 마무리하자.

// 프로덕션코드

import java.util.Stack;

public class Quiz1_CraneDrawingDollsGame {
    public int solution(int[][] board, int[] moves) {

        int numberOfPopingDolls = 0;
        int lastNumber = -1;
        int newNumber;

        Stack<Integer> stack = new Stack<>();

        for (int move : moves) {
            for (int i = 0; i < board.length; i++) {
                newNumber = board[i][move - 1];

                if (newNumber == 0) {
                    continue;
                }

                if (newNumber == lastNumber) {
                    stack.pop();
                    numberOfPopingDolls += 2;

                    lastNumber = setLastNumber(stack);
                    setAZeroAtTheZoneAfterDollIsOut(board, move, i);
                    break;
                }

                stack.push(newNumber);
                lastNumber = newNumber;
                setAZeroAtTheZoneAfterDollIsOut(board, move, i);
                break;
            }
        }


        return numberOfPopingDolls;
    }

    private void setAZeroAtTheZoneAfterDollIsOut(int[][] board, int move, int i) {
        board[i][move - 1] = 0;
    }

    private int setLastNumber(Stack<Integer> stack) {
        int lastNumber;
        if (stack.size() != 0) {
            lastNumber = stack.peek();
        } else {
            lastNumber = -1;
        }
        return lastNumber;
    }
}


// 성공!