프로그래머스_크레인 인형뽑기 게임

LeeYulhee·2023년 8월 13일
0

💻 문제 출처 : 프로그래머스_크레인 인형뽑기 게임

👉 내가 작성한 답


import java.util.*;

class Solution {
    public int solution(int[][] board, int[] moves) {
        
        int answer = 0;
        
        Stack<Integer> pickStack = new Stack<>();
        
        for (int i : moves) {
            
            int lineIndex = i - 1;
            
            for (int j = 0; j < board.length; j++) {
                int dollType = board[j][lineIndex];
                if(dollType != 0) {
                    if(!pickStack.isEmpty() && pickStack.peek() == dollType) {
                        pickStack.pop();
                        answer += 2;
                        board[j][lineIndex] = 0;
                        break;
                    } else {
                        pickStack.push(dollType);
                        board[j][lineIndex] = 0;
                        break;
                    }
                }
                
            }
        }

        return answer;
    }
}

📌 문제 풀이 설명

  • int 변수 answer를 선언하고 0으로 초기화
  • Integer를 요소로 사용하는 Stack을 pickStack이라는 이름으로 생성
  • 향상된 for문으로 moves의 요소 순회
    • int 변수 lineIndex를 생성하고 i - 1로 초기화
      • i는 몇 번째 줄을 의미하므로 배열의 인덱스로 사용하려면 - 1을 해줘야 함
    • 이중 for문으로 0부터 board의 길이 미만까지(N x N 이기 때문에 행과 열의 길이가 같음) 1씩 증가하며 순회
      • int 변수 dollType을 선언하고 board[j][lineIndex]를 대입
        • board[j][lineIndex]는 같은 열의 행만 1씩 증가하는 값
      • 만약 dollType이 0이 아니라면
        • 만약 pickStack이 비어있지 않고, pickStack의 최근 요소(peek 요소)가 dollType과 같다면
          • pickStack에 최근 값을 pop으로 제거
          • answer에 2를 더함
            • return 해야 하는 값은 제거된 인형의 개수라 한 번 pop이 일어날 때 2개가 없어지는 것
          • board[j][lineIndex]에 0을 대입해서 다음 순회 때 해당 숫자는 처리되지 않도록 하고, break로 종료
            • 이중 for문에서 다음 순회로 넘어가게 함
        • 그게 아니라면
          • pickStack에 dollType을 push로 추가하고 board[j][lineIndex]에 0을 대입한 뒤 break로 종료
  • for문 종료 후 return answer
profile
공부 중인 신입 백엔드 개발자입니다

0개의 댓글