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

권용환·2021년 8월 22일
0

programmers_level1

목록 보기
5/14
post-thumbnail

문제 바로가기

나의 풀이

이 문제에서는 테스트 1번이 말썽을 부려 오랜 시간 고민을 했다. 인덱스 에러때문에 골치가 아팠는데 잠시 밥을 먹고와서 다시 생각해보니 어디가 틀렸는지 보였다.

if (i == 0) {
	i -= 1;
} else {
	i -= 2;
}

이 부분에서 i == 0 일때도 -2를 해줘서 i = -1이 되어버린 상황이었던 것이다... (한심)

다른 사람의 풀이를 보니 stack을 활용해 푼 듯 하였다. 알고리즘 풀이를 파이썬으로 시작해서 그런가 stack이든 queue이든 모두 list를 사용하는 것이 습관화되어 이 문제에서도 Arraylist를 활용하였는데, 나처럼 Arraylist를 활용하게되면 basket에 다 채워넣은 다음 반복문을 돌면서 터지게 되는 상황이다.
만약 stack을 이 문제에서 사용한다면 같은 인형 2개가 닿을 때마다 바로 터지는 효과를 줄 수 있기에 게임이라는 목적으로 봤을 때는 stack을 활용하는 것이 훨씬 적절했을 것으로 보인다.

import java.util.*;

class Solution {
    public int solution(int[][] board, int[] moves) {
        int answer = 0;
        List<Integer> basket = new ArrayList<>();
        for (int move : moves) {
            int pick = picking(board, move - 1);
            if (pick != 0) {
                basket.add(pick);
            }
        }
        for (int i = 0; i < basket.size() - 1; i++) {
            if (basket.get(i) == basket.get(i + 1)) {
                basket.remove(i);
                basket.remove(i);
                answer += 2;
                if (i == 0) {
                    i -= 1;
                } else {
                    i -= 2;
                }
            }
        }
        return answer;
    }

    public static int picking(int[][] board, int move) {
        int picked = 0;
        for (int i = 0; i < board.length; i++) {
            if (board[i][move] != 0) {
                picked = board[i][move];
                board[i][move] = 0;
                return picked;
            }
        }
        return picked;
    }
}

다른 사람의 풀이

Stack을 활용한 홍희표님 외 5분의 풀이입니다.

import java.util.Stack;

class Solution {
    public int solution(int[][] board, int[] moves) {
        int answer = 0;
        Stack<Integer> stack = new Stack<>();
        for (int move : moves) {
            for (int j = 0; j < board.length; j++) {
                if (board[j][move - 1] != 0) {
                    if (stack.isEmpty()) {
                        stack.push(board[j][move - 1]);
                        board[j][move - 1] = 0;
                        break;
                    }
                    if (board[j][move - 1] == stack.peek()) {
                        stack.pop();
                        answer += 2;
                    } else
                        stack.push(board[j][move - 1]);
                    board[j][move - 1] = 0;
                    break;
                }
            }
        }
        return answer;
    }
}
profile
마구 낙서하는 블로그입니다

0개의 댓글