시작하기, 뭐든

코딩테스트 뿌시기3 - (JAVA)2019 카카오 개발자 겨울 인턴십크레인 인형뽑기 게임 풀이 본문

코딩테스트

코딩테스트 뿌시기3 - (JAVA)2019 카카오 개발자 겨울 인턴십크레인 인형뽑기 게임 풀이

Gascon 2022. 1. 8. 21:52

시작하기, 뭐든 - 기록 20일차

 

오늘도 레벨1 코딩테스트를 풀었다. 이게 뭐라도 또 오래 걸리다니;;;

나 빼고는 모두 간단하게 풀어 넘긴 문제 같지만..일단 해설을 해보기로 한다.

 

게임판은 int 배열로 들어가는데 index별로 가로로 값이 들어간다. 네오 인형의 숫자를 찾으려면 board 배열의 1번 index를 찾은 다음 그 객체 안에서 2번째 index를 찾으면 된다.

즉, 반복문을 두번 써야 한다는 얘기.

 

이거는 너무 당연한 개념이라서 문제가 없다.

다만 한번더 생각할 점은 board판의 크기와 크레인이 동작하는 회수 차이가 난다는 점이다.

board를 바깥 for문으로 쓰면 moves 값이 다 안풀릴 수 있으니 순서를 조심해야한다.

 

 

board 배열의 크기 : 5

moves 배열의 크기 : 8

 

이중 for문에서 바깥족에 moves가 와야하는 이유다.

 

moves의 값은 실제 index랑 1차이가 나므로 1을 빼줘야 한다.

이중 for문으로 찾은 캐릭터 숫자 값 중에서 0이 아닌 애들만 List에 넣어준다.

 

원래 List가 아니라 배열로 풀려고 했으나 List의 remove 함수처럼 값과 자리?를 둘다 지울 수 있는 방법을 못찾아서

결국 List로 풀었다.

 

담았으면 이제 중복되는 값을 빼줘야한다.

 

중복값 때는게 은근 계속 뭔가가 헷갈렸다. 나만 그런건가...

 

먼저 중복을 체크하려면 캐릭터가 하나 이상 쌓였을 때 비교해야한다.

그 다음 size에서 1 차이, 2 차이 나는 index값을 구해서 캐럭터 값을 비교한다.

이때 나는 생각없이 이렇게 코드를 짰다.

첫번째꺼 지우고, 두번째꺼 지우면 되겠지??했는데 계속 값이 이상했다.

basket2.remove(basket2.size()-1);
basket2.remove(basket2.size()-2);

그림을 그려서 다시 생각해보니 remove를 하면 사이즈가 줄어드니까 -2하면 엄한 캐릭터가 사라지게 됐던 것이다.

 

캐릭터 인형을 뽑았으면 그 자리는 0이 되어야하니깐, 0으로 초기화해준다.

마지막으로 answer은 ++로 하나씩 증가시켜줬지만 실제로는 2개의 값이 한꺼번에 사라지는 것이기 때문에 *2를 해준다.

 

전체 코드도 올려둬야겠다.

import java.util.ArrayList;

class Solution {
    public int solution(int[][] board, int[] moves) {
        int answer = 0;
        ArrayList<Integer> basket2 = new ArrayList<Integer>();
        
        for(int i=0 ; i<moves.length; i++) {
        	for(int j=0; j<board.length; j++) {
        		int select = moves[i] - 1;
        		
        		if(board[j][select]!= 0) {
        			basket2.add(board[j][moves[i] - 1]);
        			
        			if(basket2.size() !=1) {

        				if(basket2.get(basket2.size()-2)==basket2.get(basket2.size()-1)) {
        					answer++;
        					basket2.remove(basket2.size()-1);
        					basket2.remove(basket2.size()-1);
        				}
        			}
        			board[j][moves[i] - 1] = 0;
        			break;
        		}
        	}
        }
        answer = answer*2;

        return answer;
    }
}

 

이것도 깔끔한 코드는 아니고 막상 끝내고 보면 레벨1 정도의 별거아닌 느낌인데..

난 왜그리 오래도 걸렸는지..ㅎㅎ

 

근데 다른 풀이를 보니 막상 게임에서는 List가 아니라 Stack을 써야 인형이 터지는 즉각적인 효과가 난다고 한다.

List보다는 Stack이 더 올바른 풀이라는 셈.

 

Stack으로 짜여진 코드 답도 가지고와봤다.

* 프로그래머스 - 홍희표 , - , lily , 주익정 , syeon-c 외 2 명 풀이

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;
    }
}

전체적으로는 List와 비슷한데 오히려 peek과 같은 함수들을 보면 Stack이 더 깔끔해보이는거 같기도..

 

오늘도 끝!

Comments