본문 바로가기

개발지/코테

[프로그래머스] 코테연습 - 크레인 인형뽑기 게임(lv.1)

- 내 방법 풀이

  • 예전에 이 문제를 읽고 풀 방법을 생각하다가 못 풀고 남겨남었었다.
  • 오늘 다시 보니, 스택을 활용해서 푸는 문제였고 기초적인 문제.. 아직 나는 한참 멀었나보다.
  • 처음에는 인형이 쌓여있는 한줄마다 stack을 생성해야 했는데, 그렇게 풀었으면 메모리사용이 너무 컸을 거 같다. 다행히 굳이 그렇게 풀지 않아도 되는 것을 발견해서 풀이 방향을 수정했다. 
  • moves의 숫자에 해당하는 줄을 위에서부터 이차배열을 내려가면서 조회하고, 0은 패스. 숫자는 스택에 넣어주며 같은 인형인지 확인하여 인형을 삭제한다.
  • 스택은 인형을 검사할 1개면 충분했고, 나머지는 반복문과 조건문으로 푸는 간단한 문제였다.
import java.util.*;

class Solution {
    public int solution(int[][] board, int[] moves) {
        int answer = 0;
        Stack<Integer> box = new Stack<>();
        
        for (int N : moves) {
            int move = N - 1;
            for (int i = 0; i < board.length; i++) {
                if (board[i][move] == 0) continue;
                else if (!box.empty() && box.peek() == board[i][move]) {
                    board[i][move] = 0;
                    box.pop();
                    answer += 2;
                    break;
                } else {
                    box.push(board[i][move]);
                    board[i][move] = 0;
                    break;
                }
            }
        }
        
        return answer;
    }
}

- 다른 사람 방법 풀이1

  • 스택을 활용해서 푼 풀이.
  • 내 풀이와 매우 유사했다.
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;
    }
}

 

- 다른 사람 방법 풀이2

  • 이걸 가지고 자바스럽다 할 수 있는 지는 모르겠지만, 나는 클래스를 나누어 푸는 것을 생각해보다가 for문 안 if문으로 풀었기 때문에...
import java.util.Stack;

class Solution {
    static Stack<Integer> stack = new Stack<>();
    static int answer = 0;

    public int solution(int[][] board, int[] moves) {
        for(int idx : moves) {
            board = pick(board, idx - 1);
        }
        return answer;
    }
    
    static int[][] pick(int[][] board, int idx) {
        for(int i = 0 ; i < board.length ; i++) {
            if(board[i][idx] == 0) continue;

            if(!stack.isEmpty() && stack.peek() == board[i][idx]) {
                answer += 2;
                stack.pop();
                board[i][idx] = 0;
                break;
            }
            stack.push(board[i][idx]);
            board[i][idx] = 0;
            break;
        }
        return board;
    }
}