본문 바로가기
알고리즘 이전/스택, 큐

크레인 인형뽑기

by hoshi03 2023. 8. 10.

자세한 설명은 https://school.programmers.co.kr/learn/courses/30/lessons/64061

n*n board 배열에 있는 인형을 뽑을때 같은 인형이 연속해서 나오면 터진다

터지는 횟수 구하기

 

내 풀이

실패.. 반복문 안의 조건을 잘못 쓴 것 같은데 원인을 찾기 못했다

!찾은 값을 초기화 해주는것을 안해서 오답이엿고, 인형도 2개씩 터지는데 하나씩만 더해줬엇다

import java.util.*;
public class Main {
    public int Solution(int[][] board, int[] moves){
        int ans = 0;
        Stack<Integer> st = new Stack<>();
        for(int i : moves){
            int tmp = 0;
            while (tmp < board.length){
                //2차원 배열에서 만난 값이 0이아님, 값이 들어 있으면
                if(board[tmp][i-1] != 0){
                    if(st.empty()) st.push(board[tmp][i-1]);
                    else {
                        if(st.peek() == board[tmp][i-1]){
                            st.pop();
                            ans++;
                        }
                        else  st.push(board[tmp][i-1]);
                    }
                    break;
                }
                else tmp++;
            }
        }
        return ans;
    }

    public static void main(String[] args) {
        Main T = new Main();
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int[][] board = new int[n][n];

        for(int i = 0; i < n; i++){
            for(int j = 0; j < n; j++) {
                board[i][j] = in.nextInt();
            }
        }

        int k = in.nextInt();
        int[] moves = new int[k];
        for(int i =0; i < k; i++) moves[i] = in.nextInt();

        System.out.println(T.Solution(board,moves));
    }
}

 

강의 풀이 

 

!찾은 값을 초기화 해주는것을 안해서 자꾸 틀린 것 같다.., 인형도 2개씩 터지는데 하나씩만 더해줬엇다

import java.util.*;
public class Main {
    public int Solution(int[][] board, int[] moves){
        int ans = 0;
        Stack<Integer> st = new Stack<>();
        for(int i : moves){
            //크레인 하강 행 방향으로
            for(int j = 0; j < board.length; j++){
                if(board[j][i-1] != 0){
                    int tmp = board[j][i-1];
                    //인형을 가져온 곳은 0으로 바꿔주기
                    board[j][i-1] = 0;
                    if(!st.empty() && tmp == st.peek()){
                        //인형 두개 터지니까 +2
                        ans += 2;
                        st.pop();
                    }
                    else st.push(tmp);
                    break;
                }
            }
        }
        return ans;
    }

    public static void main(String[] args) {
        Main T = new Main();
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int[][] board = new int[n][n];

        for(int i = 0; i < n; i++){
            for(int j = 0; j < n; j++) {
                board[i][j] = in.nextInt();
            }
        }

        int k = in.nextInt();
        int[] moves = new int[k];
        for(int i =0; i < k; i++) moves[i] = in.nextInt();

        System.out.println(T.Solution(board,moves));
    }
}

 

위에 같은 실수는 앞으로 하지 말게 잘 기억해두자

'알고리즘 이전 > 스택, 큐' 카테고리의 다른 글

교육과정 설계  (0) 2023.08.12
공주 구하기  (0) 2023.08.11
후위식 연산  (0) 2023.08.10
괄호문자제거  (0) 2023.08.08
올바른 괄호  (0) 2023.08.08