프로그래머스 (2019 카카오 개발자 겨울 인턴십 크레인) 인형뽑기 게임

홍성우·2023년 1월 18일

알고리즘 정복

목록 보기
5/10
post-thumbnail




출처:https://school.programmers.co.kr/learn/courses/30/lessons/64061

[문제 이해하기]
문제를 일고 목적을 먼저 파악해보았다.
목적 : 크레인을 모두 작동시킨 후 터트려져 사라진 인형의 개수

파라미터 : board, moves
board배열은 인형의 정보가 들어있는 2차원 배열
moves배열은 크레인의 이동정보 배열

for문을 통해 크레인을 움직이면서 해당 위치에 인형을 집어 stack영역에 채워넣는 방법으로 구현을 생각했다.
문제는 배열을 보통 0번째 인덱스 부터 N-1까지 밑으로 순차적으로 구성된다. 열도 0부터 N-1까지 순차적으로 구성된다(문제에서는 NxN)
즉 moves[i] 원소가 1이면 0번째를 의미하고, 원소가 1이면 0행이 아닌 0을 살펴봐야한다.
즉 열이 기준이 된채로 행을 바꾸는 것이다.

for(int i = 0; i <n; i++){
	for(int j = 0; j <n; j++){
    	arr[j][i] // 열을 기준으로 순회
    }
  }

구현하면이러한 방식이다.

그리고 문제에서는 공백은 0을 의미하여
크레인이 인형을 집을때 0이 아닌것을 발견했다면 집고 break을 걸어준다(break을 걸어주지 않으면 한열에 모든 인형을 끝까지 집을 것이다)

옮기는 작업을 진행하며
stack영역에 옮길때 가장 최상단 원소를 확인한다. stack.peek()이때 최상단원소와 크레인이 집어온 원소와 같다면 stack.pop()을 하며 정답 갯수는 2개씩를 늘린다. 인형2짝이 한쌍이기 때문이다.

[전체소스코드]

import java.util.*;
class Solution {
    public Stack<Integer> st = new Stack<>();
    public int answer = 0;
    public int solution(int[][] board, int[] moves) {
      
        // 목적 : 크레인을 모두 작동시킨 후 터트려져 사라진 인형의 개수
        // moves : 크레인 이동 동작
        // 결과를 담을 stack

        
        int n = board.length;
        
        for(int i = 0; i <moves.length; i++){
            // 크레인 동작 움직이기
            int num = moves[i];
            for(int j = 0; j <n; j++){
                //보드에서 원소 집기
                if(board[j][num-1] != 0){
                   // check함수구현
                    check(board[j][num-1]);
                  
                   // 빈 값표시
                    board[j][num-1] = 0;
                   
                   
                   break; 
                }
               
            }
           
        }
       
        return answer;
    }
    
    public void check(int num){
        if(!st.isEmpty() && st.peek() == num){
            st.pop();
            answer+=2;
          
        }else{
            st.push(num);
            
        }
 
      
    }
}
profile
제 블로그를 방문해 주셔서 감사합니다

0개의 댓글