[2020-11-03] 크레인 인형뽑기 게임

2020. 11. 4. 10:30코딩테스트

푼 시간 : 3시간

언어 : 자바

 


 

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

 

문제를 풀기 위해 처음 생각 했던것은 조건이었다.

같은것이 2개 만나면 터지는 조건으로 애니팡과 비슷한 조건이었다.

 

배열을 하나 만들어, 인형들을 집어넣을 칸을 만든 뒤 인형을 터트릴때에 카운트를 뒤로

물리는것에 대한 생각을 정말 많이 했다. 효율적으로 쓰고싶어 s를 만드는 것에 대한 생각이 먼저 떠올랐지만 계속 다른 방법을 생각했으나 도저히 떠오르지 않아 그냥 s를 만들어 인형이 들어오고 터질때의 카운트를 만들어줬다.

 

k번째 인형과 k-1번째 인형이 같은지 보기위해 생각하다보니 k를 1부터 설정해야 배열 범위상 오류가 나지않았고,

else if를 a[s-1]!=0으로 설정한 이유는 혹시라도 0번째부터 시작할 일이 없도록 설정한것이다.

터지고나서 s에 넣을것을 처음에는 단순히 s--로 했으나,

너무 1차원적인 생각이란것을 깨닫는데는 시간이 채 걸리지않았다. 얼른 s=k-1로 수정하고 풀었던 것 같다

 

풀면서 계속 Hash를 쓰고싶은 생각을 했지만 Hash는 아직 이해를 완전하게 하지 못해서 그냥 맨땅에

헤딩하듯이 배열로 풀었다. Stack을 쓰거나 Hash를 썼으면 더 시간이 적게 걸렸으리라 생각된다.

효율적으로 풀고싶다는 마음에 구상도 오래걸리고

막상 만들다보니 효율적이지 않고 허술해 시간 허비가 많았던 것 같다.

 

class Solution {
	public int solution(int[][] board, int[] moves) {
		int answer = 0;
		int s=0;								
        // a[]에 몇개가 들어가있는지 카운트
		int a[]=new int[moves.length];			
        // board[][]의 인형이 들어갈 변수

		for(int i=0; i<moves.length; i++){
			for(int j=0; j<board.length; j++){
				if(board[j][moves[i]-1]!=0){
					a[s]=board[j][moves[i]-1];	
                    // [moves[i]-1]를 해야 배열순서에 맞춤
					s++;						
                    // 인형 넣으면 카운트
					board[j][moves[i]-1]=0;		
                    // 인형을 뽑았으니 0
					break;
				}
			}
            
            if(a[0]==0)
                continue;						
                // 0이면 카운트 X
            
			else if(a[s-1]!=0) {
				for(int k=1; k<a.length; k++) {
					if(a[k]==0)					
                    	// 0이면 break x
						break;
					else if(a[k]==a[k-1]) {
						a[k]=0;
						a[k-1]=0;
                        
						s=k-1;					
                     	// k번째와 k-1번째가 같다면 k-1부터
						answer+=2;
					}
				}
			}
		}

		return answer;
	}
}

 

카카오는 항상 문제부터 읽기가 어려워서 복잡 한 것 같다..ㅎㅎ