Algorithm/Programmers

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

ikjo 2022. 1. 19. 16:07

문제 설명

 

 

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

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

 

풀이 : Success

소스 코드

import java.util.*;

class Solution {
    public int solution(int[][] board, int[] moves) {
        int answer = 0, cnt = -1;
        int n = board.length;

        List<Integer> basket = new ArrayList<>();

        for (int item: moves) {
            for (int i = 0; i < n; i++) {
                if(board[i][item-1] != 0) {
                    cnt++;
                    basket.add(board[i][item-1]);
                    board[i][item-1] = 0;
                    if(cnt>0 && basket.get(cnt) == basket.get(cnt-1)) {
                        basket.remove(cnt);
                        basket.remove(cnt-1);
                        answer += 2;
                        cnt -= 2;
                    }
                    break;
                }
            }
        }

        return answer;
    }
}

 

풀이 회고

우선 터트려져 사라진 인형의 개수(결과값)를 저장하기 위한 answer 변수를 0으로 초기화시켜주었고, 바구니에 담긴 인형의 인덱스를 나타내기 위한 cnt 변수를 -1로 초기화시켜주었다. cnt가 -1이라는 것은 현재 바구니에 인형이 없다는 것을 의미한다.

 

이때 바구니는 ArrayList 자료구조를 이용하여 나타내고자 했다. 왜냐하면 바구니에 인형을 추가(add) 및 삭제(remove)하는 작업보다는 바구니에 존재하는 특정 인형에 접근(get)하는 작업이 더 많다고 생각했기 때문이다.

 

입력받는 매개변수 정수형 배열 moves의 원소들은 게임 화면의 가로(열) 인덱스를 가리키므로 for문을 통해 moves의 원소들을 순회하도록 했고 이때 해당 가로(열) 상 세로(행)을 다시 순회하여 가장 위에 있는 인형부터 바구니에 담도록 했고 바구니에 인형이 하나 증가했으므로 cnt는 +1 해주었다. 인형을 바구니에 담으면 더이상 세로(행)을 순회하면 안되므로 break 시켰다.

 

이후 바구니에 기존에 있었던 인형과 방금 담았던 인형이 일치한다면 두 인형을 바구니에서 삭제시키고 결과값 answer를 +2 해주었다. 또한 두개의 인형이 줄었으므로 cnt는 -2 해주었다.

 

 

참고자료

  • https://programmers.co.kr/learn/courses/30/lessons/64061