[프로그래머스] 64061번: 크레인 인형뽑기 게임 (JAVA)

2023. 8. 11. 10:46·Skills/Algorithm
import java.util.*;

class Solution {
    public int solution(int[][] board, int[] moves) {
        // 크레인으로 뽑아서 인형을 넣으면 -> 그 공간은 위아래방향으로 '쌓인다.'
        // -> stack.
        // 현재 board 상태를 시각화하는 코드
        ArrayDeque<Integer> stack = new ArrayDeque<>(); // moves를 통해서 열을 지정해서 (1~5)
        int answer = 0; // 같은 것이 '펑'한 횟수
        // System.out.println(stack);
        // for (int[] b : board) {
        //     for (int i : b) {
        //         System.out.print(i);
        //     }
        //     System.out.println();
        // }
        // 크레인의 움직임
        for (int move : moves) {
            // System.out.println("뽑는 열 : " + move);
            // 열 -> move 인덱스 / board.length -> 얼마나 가로줄에 겹쳐있는지
            for (int row = 0; row < board.length; row++) {
                // if (board[row][move - 1] == 0) { // move는 1부터 시작하고, index는 0부터...
                //     // == 0 => 비어있다
                //     continue; // 다음 줄로 넘어가기
                // }
                if (board[row][move - 1] != 0) {
                    // 0이 아닌 값을 발견하면 -> 들어올릴 인형이 있다
                    // 그 인형 값이 곧 'board[row][move - 1]'
                    // ** 답을 내기 위해서는 여기를 수정 **
                    
                    // 2가지 상황
                    // 1. 새롭게 넣은 인형과 기존의 가장 끝(peek) 인형이 동일하다
                    // => 가장 끝 인형과 새롭게 넣은 인형을 터트려버린다 (추가X, 끝점X)
                    // 2. 동일하지 않거나, 아예 stack이 비어있다
                    // => 그냥 쌓는다 (추가한다)
                    int doll = board[row][move - 1];
                    // System.out.println("이번에 뽑음 : " + doll);
                    // System.out.println("직전에 뽑힘 : " + stack.peek());
                    // !stack.isEmpty() -> stack.peek()이 null일 경우를 배제
                    if (!stack.isEmpty() && doll == stack.peek()) {
                        // System.out.println("펑!");
                        stack.pop(); // 직전 거를 삭제만..
                        answer+=2; // 짝을 맞춰서 2개 사라짐
                        // System.out.println("사라진 인형 수 : " + answer);
                    } else {
                        stack.push(board[row][move - 1]);
                        // 크레인으로 집어올린 건 stack에 넣고   
                    }
                    board[row][move - 1] = 0; // 그 자리를 0으로 만들어준다
                    break; // 그러고 반복 멈춤
                }
            }
            // System.out.println(stack);
            // for (int[] b : board) {
            //     for (int i : b) {
            //         System.out.print(i);
            //     }
            //     System.out.println();
            // }
        }
        // answer 결과 -> 똑같은 것이 2개 겹치면... 터트리고 그 자리를 좁혀서 시작...
        return answer;
    }
}

'Skills > Algorithm' 카테고리의 다른 글

[백준] 10799번: 쇠막대기 (JAVA)  (0) 2023.08.11
[백준] 2161번: 카드1 (JAVA)  (0) 2023.08.11
[백준] 28278번: 스택 2 (JAVA)  (1) 2023.08.11
알고리즘 Java 스택  (0) 2023.08.11
[백준] 1158번: 요세푸스 문제 (JAVA)  (0) 2023.08.11
'Skills/Algorithm' 카테고리의 다른 글
  • [백준] 10799번: 쇠막대기 (JAVA)
  • [백준] 2161번: 카드1 (JAVA)
  • [백준] 28278번: 스택 2 (JAVA)
  • 알고리즘 Java 스택
개발자 윤구나
개발자 윤구나
개발 공부를 하고 있습니다. Let's go!
  • 개발자 윤구나
    이것은 무엇?????
    개발자 윤구나
    • 분류 전체보기
      • Skills
        • Java
        • Database
        • Flutter, Dart
        • JavaScript
        • React
        • HTML5
        • CSS3, SCSS
        • PHP
        • C#
        • Unity
        • Algorithm
        • GIT·GitHub
        • 그 외
      • Book Review
      • IT NEWS
      • 설계
      • 자기 계발
  • 블로그 메뉴

    • 홈
    • 방명록
  • 인기 글

  • 최근 글

  • 최근 댓글

  • 전체
    오늘
    어제
  • hELLO· Designed By정상우.v4.10.3
개발자 윤구나
[프로그래머스] 64061번: 크레인 인형뽑기 게임 (JAVA)
상단으로

티스토리툴바