새소식

Algorithm/Programmers

(JAVA) [프로그래머스] 64061번, 2019 카카오 개발자 겨울 인턴십 > 크레인 인형 뽑기

  • -
728x90

 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

64061, 크레인 인형 뽑기

📌 [ 난이도 : LEVEL 1 ]

이번 문제는 Stack 과 ArrayList 를 사용해서 풀이했다.

List 안에 Stack 을 사용하여 풀면 더 쉬울 것 같은데 그러한 방법이 있는지 모르겠어서 기존의 형시대로 풀이를 진행했다.

-

📚 Process

초기화 및 선언

: 뽑을 인형들을 넣을 backet(stack) 과 주어진 보드 데이터들을 담을 doll(ArrayList[]), 많이 사용되는 보드의 사이즈와답을 도출할 ans 라는 변수를 선언한다. 그리고 마지막 board 에 담긴 데이터부터 밑에 위치되어 있기 때문에 끝의 데이터부터 루프를 돌아 doll 변수에 데이터를 할당한다. (0은 빈칸이기 때문에 continue)

 

인형 뽑기

: pickDoll 이라는 메서드에 구현했다. 배열의 0번째 index부터 데이터가 있기 때문에 -1 을 해준다.

뽑을 인형이 있는지 확인할 수 있는 possible 메서드를 만들었다. 뽑을 수 있다면 뽑고 기존의 데이터를 삭제한다.

(이 부분이 번거로워서 Stack 을 활용하고 싶었다.)

뽑은 데이터를 backet (stack) 과 참조하고 이후 로직을 진행하며 cnt 를 늘려가면 된다.

 

✅ 전체 코드

: 카카오의 코딩테스트 문제라 겁을 많이 먹고 시작했지만 생각보다 어렵진 않고 구현이 귀찮았던 문제, 더 좋은 풀이가 있다면 댓글로 남겨주시면 감사하겠습니다. : )

import java.util.*;

class Solution {
    // 바구니에 담길 Stack
    static Stack<Integer> backet = new Stack<>();
    static ArrayList<Integer>[] doll;
    static int boardSize, cnt;
    
    public int solution(int[][] board, int[] moves) {
        boardSize = board.length;
        // 보드 데이터 생성
        doll = new ArrayList[boardSize];
        for(int i=0; i<boardSize; i++) doll[i] = new ArrayList<>();
        
        // 보드 데이터 입력
        for(int i=boardSize-1; i>=0; i--) {
            for(int j=0; j<board[i].length; j++) {
                if(board[i][j] == 0) continue;
                doll[j].add(board[i][j]);
            }
        }
        
        pickDoll(moves);
        
        return cnt;
    }
    
    static void pickDoll(int[] moves) {
        for(int index : moves) {
            // 0번째 라인부터 시작
            index--;
            // 뽑을 인형이 있는지 확인
            if(!possible(index)) continue;
            // 해당 라인에 마지막 인형을 뽑아옴
            int pick = doll[index].get(doll[index].size()-1);
            // Delete
            doll[index].remove(doll[index].size()-1);
            // 없으면 insert
            if(backet.isEmpty()) {
                backet.push(pick);
                continue;
            }
            // 뽑은 것과 직전에 넣은 것이 같다면 삭제
            if(backet.peek() == pick) {
                backet.pop(); cnt += 2;
            }
            else {
                backet.push(pick);
            }
        }
    }
    
    static boolean possible(int index) {
        if(doll[index].size() == 0) return false;
        return true;
    }
}
728x90
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.