Post

Stack_크레인 인형뽑기

✅ 크레인 인형뽑기

첫 번째 줄에 자연수 n이 주어집니다.
두 번째 줄부터 n * n board 배열이 주어집니다.
다음 줄에는 크레인이 몇 번 움직였는지 나타내는 자연수 m이 주어집니다.
마지막 줄에는 크레인이 어떻게 움직였는지 나타내는 moves배열이 주어집니다.

크레인이 좌우로 움직여서 멈춘 위치에서 가장 위에 있는 인형을 집어 올립니다.
집어 올린 인형은 바구니 bucket에 쌓입니다.
만약 같은 모양의 인형 두 개가 바구니에 연속해서 쌓이면 두 인형은 바구니에서 사라집니다.
인형이 없는 곳에서 크레인을 작동시키면 아무일도 일어나지 않습니다.
크레인을 모두 작동시킨 후 터트려져 사라진 인형의 개수를 구하세요.

Screenshot 2024-05-11 at 01 16 00

코딩공책-39 2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
class Main {

    public int solution(int[][] board, int[] moves){
        int answer=0;
        Stack<Integer> bucket= new Stack<>();
        for(int m: moves){
            for(int row=0; row<board.length; row++){ //⭐️ row0부터 시작해서 column 길이만큼 내려가기
                int col= m-1; //배열은 0~4인데 크레인 움직이는 배열 moves는 1~5니까
                if(board[row][col] !=0){ //인형이 있어?
                    int doll= board[row][col];
                    board[row][col] =0; //인형 뽑았으니까 0(인형 없음)
                    if(!bucket.isEmpty() && bucket.peek() == doll){ //바구니에 인형이 있고 가장 위 인형이 집어넣으려는 인형이랑 똑같으면
                        bucket.pop();
                        answer +=2;
                    }else{
                        bucket.push(doll);
                    }
                    break; //인형 찾았으면 if문 그만 돌아
                }

            }
        }
        return answer;
    }
    public static void main(String[] args) {
        Main T = new Main();
        Scanner sc= new Scanner(System.in);
        int n= sc.nextInt();
        int[][] board= new int[n][n];
        for(int i=0; i<n; i++){
            for(int j=0; j<n; j++){
                board[i][j] = sc.nextInt();
            }
        }
        int m= sc.nextInt();
        int[] moves= new int[m];
        for(int i=0; i<m; i++){
            moves[i]= sc.nextInt();
        }
        System.out.print(T.solution(board, moves));

    }
}
//⭐️input:
// 5
// 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
// 8
// 1 5 3 5 1 2 1 4
//⭐️output:
//4

⭐️ 부가설명

✔️ row0부터 시작해서 위에서부터 아래로 인형이 있는 곳을 찾아야 함.

이 때 column길이만큼 탐색해야 함.
2차원 배열에서 column길이를 구하는 방법은 array.length

🔵 ThingsILearned

✔️ board를 stack으로 받아야할지, 그냥 2차원 array로 받아야 하는지 헷갈렸다.

board에서 가장 상단에 있는 인형을 뽑아야 하기 때문이다.
생각해보면, board가 stack이었더라도 0이 아닌 수를 찾아야 하기 떄문에 stack을 쓰는 큰 의미가 없다.
따라서 2차원 array로 정의하고, 배열을 돌면서 0이 아닌 첫 번째 인덱스를 찾아야 한다.
그나저나, 2D stack은 존재하지 않는다!

🟢

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
class Main {

    public int solution(int n, int[][] board, int m, int[] moves){
        int answer=0;
        Stack<Integer> bucket= new Stack<>();
        for(int i=0; i<m; i++){
            int col= moves[i]-1;
            int row=0;
            for(int j=0; j<n; j++){
                if(board[j][col] !=0) {
                    row=j;
                    break;
                }
            }
            int doll= board[row][col];
            if(bucket.isEmpty()){
                bucket.push(doll);
            }else{
                if(bucket.peek() == doll){
                    bucket.pop();
                    answer++;
                }else{
                    bucket.push(doll);
                }
            }
            board[row][col] = 0;
        }
        answer= answer *2;
        return answer;
    }
    public static void main(String[] args) {
        Main T = new Main();
        Scanner sc= new Scanner(System.in);
        int n= sc.nextInt();
        int[][] board= new int[n][n];
        for(int i=0; i<n; i++){
            for(int j=0; j<n; j++){
                board[i][j] = sc.nextInt();
            }
        }
        int m= sc.nextInt();
        int[] moves= new int[m];
        for(int i=0; i<m; i++){
            moves[i]= sc.nextInt();
        }
        System.out.print(T.solution(n, board, m, moves));

    }
}
  1. board, moves는 모두 각각 2차원, 1차원 배열로 받는다.
  2. moves가 움직이는 동안 for(int i=0; i<m; i++){}
  3. board 배열은 인덱스가 0, 1, 2, 3, 4인데 크레인이 움직인 moves 배열은 1~5까지니까,
    크레인이 가리키는 board column을 알기 위해서는 -1을 해야 한다.
    int col= moves[i]-1;
  4. row를 돌면서, column에서 인형이 있는 row를 찾아야 한다. 즉, 0이 아닌 row를 찾아야 한다.
    if(board[j][col] !=0) {
  5. 찾았으면, 그 인형을 doll이라는 변수에 저장하고 int doll= board[row][col];
    그리고 찾는 if문 그만하기. break
  6. 이제 doll을 bucket에 더할건데, 그 전에!
  7. bucket이 비어있으면 무조건 더한다. bucket.push(doll);
  8. bucket이 안 비어있으면 두 가지 경우가 있는데,
  9. 지금 가장 상단에 있는 인형이 지금 넣으려는 인형과 같은 경우.
    같은 경우에는 가장 상단에 있는 인형 pop
    그리고 answer++;
  10. 지금 가장 상단에 있는 인형이 지금 넣으려는 인형과 다른 경우.
    다른 경우에는 그냥 인형 넣어주면 되지. push
  11. 인형 뽑았으면 이제 그 자리에는 인형이 없으니까 0으로 만들기
  12. 인형은 항상 2개씩 pop되었을 것이므로 answer= answer*2
This post is licensed under CC BY 4.0 by the author.