hoon's bLog

[Java] 프로그래머스 크레인 인형뽑기 게임 자바 본문

코딩테스트/프로그래머스

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

개발한기발자 2022. 6. 17. 15:24
반응형

문제 출처 : https://programmers.co.kr/learn/courses/30/lessons/64061

 

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

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


 

 

 

와.... 역대급 문제 이미지인 것 같다 ㅎㅎㅎ

한 컷으로 편집하려 했으나.... 역부족이었다....

역시 카카오는 다르다는 말밖에....ㅋㅋㅋㅋㅋㅋ

예시 사진이 동적으로 움직이는 정성까지 ㄷㄷ ㅋㅋㅋㅋㅋㅋ

문제길이에 난독증은 기분 탓인 건가

아무튼 문제풀이 Let's Go!!

 

 

[나의 풀이]

- 어떤 값들을 쌓는다는 개념에서 Stack을 착안!

- Stack 배열 boardStack[]에 입력 배열 board[][]를 다음과 같이 넣어준다!

board[4][4]       board[0][4]
board[4][3]       ...
board[4][2]     ...  
board[4][1]   ...    
board[4][0] ...      
boardStack[0] boardStack[1] boardStack[2] boardStack[3] boardStack[4]

- for 문을 통해 Stack배열로 화면을 구성하고, 그 배열에 순차적으로 board배열의 값을 넣어서 문제와 같이 Stack을 구성한다!

- Stack의 peak / push / pop 메서드를 통해 확인 / 입력 / 삭제 진행!

import java.util.Stack;
public class Solution {
    public int solution(int[][] board, int[] moves) {
        int answer = 0;
        Stack[] boardStack = new Stack[board.length];   //화면용 Stack 배열
        Stack<Integer> basket = new Stack<Integer>();   //인형을 뽑아 담을 바구니 Stack

        //화면용 stack배열 안에 stack 만들기
        for(int i = 0; i < board.length; i++){
            boardStack[i] = new Stack<Integer>();
        }
        //배열 index를 맞춰주기 위해 입력 배열(board)의 길이-1
        for(int i = board.length-1; i >= 0; i--){
            for(int j=0; j < board.length; j++){
                if(board[i][j] != 0)
                    boardStack[j].push(board[i][j]);
            }
        }

        for(int i = 0; i< moves.length; i++) {
            // 이동은 최소 1이기에 -1로 index 조절
            // 해당 stack 비어있으며 그대로 진행
            if(boardStack[moves[i]-1].empty()) continue;
            //boardStack 맨 위에서 나올 숫자
            int popNo = (int) boardStack[moves[i]-1].pop();

            if(basket.size() == 0)          //빈 바구니에 최초 put
                basket.push(popNo);
            else{
                if(popNo == basket.peek()){ //바구니에서 같은 인형인지 값 확인
                    answer += 2;            //2개일 때 인형이 사라지므로 return값 +2
                    basket.pop();           //pop으로 해당값 삭제
                }else{ 
                    basket.push(popNo);     //아니면 그냥 push
                }
            }
        }
        return answer;
    }
}

이 것이 카카오의 벽인 건가?ㄷㄷ

시간제한이 있었다면 이미 탈락 수준이다.....

그나마라도 생각난 게 다행이다...라고

자축했지만, "인턴십"!!! 무려 인턴십!!!

문제에 자책할 수밖에............

이 것도 설마 Stream으로 하진 않았겠지?

라는 조심스러운 마음으로 다른 사람들의 코드를 옅보면~~

 

[다른 사람의 풀이-1]

import java.util.Stack;

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

 

[다른 사람의 풀이-2]

import java.util.ArrayList;
import java.util.List;
class Solution {
    public int solution(int[][] board, int[] moves) {
        int answer = 0;
        List<Integer> nums = new ArrayList<Integer>();

        for(int i=0;i<moves.length;i++){
            for(int j=0;j<board.length;j++){
                if(board[j][moves[i]-1]!=0){
                    nums.add(board[j][moves[i]-1]);
                    board[j][moves[i]-1]=0;
                    break;
                }
            }
        }
        for(int k=0;k<nums.size();k++){
            if(k!=(nums.size()-1)){
                if(nums.get(k)==nums.get(k+1)){
                    nums.remove(k);
                    nums.remove(k);
                    answer++;
                    k=-1;
                }
            }
        }
        return answer*2;
    }
}

 

[정리]

- 자료구조 관련 알고리즘엔 Collection Framework를 사용하는 게 효과적이다!

- Stack형 배열을 굳이 쓰지 않아도.... 방법은 늘 있다....

 

개인피셜 난이도 : ★★★☆☆

개인적으로 간만에 시간이 오래 걸렸다...

늘 반복문, 조건문, 배열, List로만 꼼지락 거리다가,

Stack이란 Collection Framework를 사용하려니 머리가 복잡했다...ㅠㅠ

 

계속해서 사고하는 능력을 멈추지 않고,

끊임없이, 꾸준히, 코딩 테스트 연습을 통해,

시간을 절약해보도록,

시간을 많이 투자해야겠다...?

 

오래 걸렸다고 좌절하지 말고,

끝까지 내 힘으로 풀어보자!

 

끝.

728x90
반응형