본문 바로가기
정리/알고리즘

프로그래머스 - 크레인 인형뽑기

by Hudini30 2022. 3. 28.

프로그래머스 (코딩테스트연습) - 크레인 인형뽑기

해당 문제는 스택에 뽑은 번호를 넣어두고, 번호를 뽑을 때 마다 해당 스택의 peek값과 비교해 같다면 pop을 하고 answer 값을 1씩 더해주었고, 같지 않다면 스택에 계속 쌓는 식으로 구현하였다. move 좌표의 높이를 알고 있다면 바로 이중 배열에서 가져갈 수 있을 거라 생각해 board 각 좌표의 높이를 구한 후에 스택 로직을 수행했었는데,

public int solution(int[][] board, int[] moves) {
        int answer = 0;
        int N = board.length;
        int[] boardXHeight = new int[N];
        Stack<Integer> barket = new Stack<>();

        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                if (board[i][j] > 0) {
                    boardXHeight[j]++;
                }
            }
        }

        for (int moveX : moves) {
            int xHeight = boardXHeight[moveX - 1]--;
            if (xHeight > 0) {
                int pick = board[N - xHeight][moveX - 1];
                if (!barket.isEmpty() && barket.peek() == pick) {
                    barket.pop();
                    answer++;
                } else {
                    barket.push(pick);
                }
                board[N - xHeight][moveX - 1] = 0;
            }
        }

        return answer * 2;
    }

스택에 넣고 peek값과 비교하는 로직은 같지만 그외 뽑은 인형을 구하는 건 아래 방식이 더 효율적으로 보인다.

public int solution2(int[][] board, int[] moves) {
        int answer = 0;
        int N = board.length;
        Stack<Integer> barket = new Stack<>();

        for (int moveX : moves) {
            for (int floor = 0; floor < N; floor++) {

                int pick = board[floor][moveX - 1];
                if (pick > 0) {
                    if (!barket.isEmpty() && barket.peek() == pick) {
                        barket.pop();
                        answer++;
                    } else {
                        barket.push(pick);
                    }
                    board[floor][moveX - 1] = 0;
                    break;
                }
            }
        }

        return answer * 2;
    }

댓글