마이의 개발 블로그

[프로그래머스] 크레인 인형뽑기 게임 (Java) 본문

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

[프로그래머스] 크레인 인형뽑기 게임 (Java)

개발자마이 2022. 3. 8. 01:16
반응형
 

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

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

 

작성코드

  1. board[][] 배열을 세로로 접근해야 하는데(각 인형뽑기 번호에 따른 컬럼), 이를 위한 index 배열을 선언한다.

  2. 주어진 board[][] 배열은 다음과 같이 접근한다 : board[index[move]][move]

  3. moves[] 배열을 돌며 인형뽑기를 진행한다. 경우의 수를 처리해준다 (하단 코드 참조)

  4. 상쇄된 인형의 갯수를 반환한다.

 

import java.util.*;

class Solution {
    public int solution(int[][] board, int[] moves) {
        
        int answer = 0;
        
        //board 배열의 세로 index를 체크하기 위한 int[] index 배열 선언
        int[] index = new int[board.length];
        
        Arrays.fill(index, 0);
        
        for(int i=0; i<board.length; i++){
        	//0인 경우 빈칸이므로 인형이 존재하거나 세로 index의 범위를 넘어가지 않을 때까지 index 증가시키기  
            while(board[index[i]][i] == 0 && index[i] < board.length - 1)
                index[i]++;
        }
		
        //뽑힌 인형이 놓일 스택 선언
        Stack<Integer> stack = new Stack<>();
        
        //인형뽑기 반복문
        for(int i=0; i<moves.length; i++){
            
            //move의 숫자가 1부터 시작하기 때문에 배열 인덱스에 맞춰 1 감소시키기
            int move = moves[i] - 1;
            
            //index가 board의 범위를 넘어가지 않을 때에만 동작시키기
            if(index[move] < board.length){
                //스택이 비어있는 경우 무조건 인형 하나 집어넣기
                if(stack.isEmpty()){
                    stack.push(board[index[move]][move]);
                    index[move]++;
                }else {
                    //스택 상단에 있는 인형과 비교하여 같을 경우 상쇄 (하나 뽑고 답변에 2개 증가시키기)
                    if(stack.peek() == board[index[move]][move]){
                        stack.pop();
                        answer += 2;
                        index[move]++;
                    //스택에 들어있는 인형이 다를 경우 스택에 인형 집어넣기
                    }else if(stack.peek() != board[index[move]][move]){
                        stack.push(board[index[move]][move]);
                        index[move]++;    
                    }
                }
            }
        }
        
        return answer;
    }
}

 

Note

인형이 담겨있는 배열을 직관적으로 사용하기 위해 가로와 세로를 바꾸고 0을 전부 제외하여 별도의 이중 배열에 복사할까도 고민했지만 메모리 낭비인 거 같아 그냥 index배열만 활용해서 해결해봤다.

반응형
Comments