본문 바로가기
문제풀이/프로그래머스

크레인 인형뽑기 게임 / 프로그래머스 연습문제 / programmers / Level 1 / 스택이 뭔지도 모르고 풀어 버린...

by RUCKUS 2021. 4. 27.

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

한창 자바를 배우는 중이다. 알고리즘 공부를 위해 프로그래머스가 괜찮다고 해서, 무작정 풀어보기 위해 들어갔다.

가장 쉽겠지 라고 생각한 Level1을 누르고 가장 처음 보이는 이 인형뽑기를 보았는데...

 

사실 나한테는 굉장히 어렵게 느껴졌다. 내가 아는 거라고는 겨우 배열, 반복분 정도였기 때문...

이 문제를 풀고나서 사실 stack이라는게 있다는걸 알게 되었다.

 

그리하여 얻은 결론은

 

1. 배워야할게 너무 많다.

2. 기본적인 문법으로도 어떻게든 구현은 가능할 수 있다.

3. 결국 stack과 같은 것도 내부적으로는 코드가 은닉되어 있다.

 

라고 내 스스로 유추하고 결론내렸다. 아니면 댓글좀...ㅎ

 

그럼 나는 이 문제를 어떻게 풀었는가?

 

내 코드는 다음과 같다.

 

class Solution {
    public int solution(int[][] board, int[] moves) {
		int answer = 0;
		int[] res = new int[moves.length];
        // 바구니(res) 배열의 크기를 사용횟수(moves)와 동일하게 설정한다.

		int cnt = 0;
		
       
		for (int i = 0; i < moves.length; i++) {
		// 사용횟수 만큼 반복문을 실행할 것 이다.
			for (int j = 0; j < board.length; j++) {
            // 그 다음 게임 화면의 행의 수 만큼 반복한다.
            	
				if (board[j][moves[i] - 1] != 0) {
                // 만약에 게임화면의 [j] 번째 행의 [크레인이 집은 위치(moves[i]-1)] 가 0이 아니면
                // 0이 아니라는 것은 해당 위치에 숫자가 존재한다는 의미,
                // 숫자가 존재한다는 건 1~5 인형이 존재한다는 뜻으로 그 인형을 바구니에 담아준다.
                
					res[cnt] = board[j][moves[i] - 1];
                    // 해당 위치에 값이 바구니의 [cnt] 번째 값으로 초기화 되었다.
                    
					if (cnt >= 1 && res[cnt] == res[cnt - 1]) {
                    // 만약에 바구니에 2개이상 담겨있으면서 (cnt >= 1)
                    // 방금 담은 인형과 그 전에 담은 인형이 같은 인형이라면 res[cnt] == res[cnt - 1]
                    
						res[cnt] = 0;
						res[cnt - 1] = 0;
						cnt -= 2;
						answer += 2;
                        // 해당 인형 2개를 없애주고 사라진 인형개수를 return에 더해준다.

					}
					cnt++;
                    // 인형이 채워졌으니 넣을 칸을 한칸 올려준다
					board[j][moves[i] - 1] = 0;
                    // 가져온 인형이 원래 있던 게임 화면에 인형을 제거한다.
					break;
                    // 가져왔으니 반복문을 더 돌릴필요없으므로 멈추고 사용횟수로 넘어간다.
				}		

			}

		}

		return answer;
        // 결과출력
    }
}

 

작성하고 다른 사람들의 풀이를 보니

stack의 push(), pop()??이라는 메소드들을 활용해 나보다 더 간단하고 쉽게 구현한 것을 볼 수 있었다.(젠장 ㅠㅠ)

그래도 일반적인 사람들과는 다른 방식으로 구현했다는 것에 만족하고, 추후에는 스택으로도 연습해볼 생각이다.

 

평균적으로 0.10ms의 처리속도를 가졌는데, 이게 빠른건지 느린건지 아직은 감이 잘 안온다.

 

for, if 만세!!!

 


[깃허브]

https://github.com/RUCKUSJERRY/practiceOfJava/blob/main/Prs_Pratice/src/com/level01/crain.java

 

RUCKUSJERRY/practiceOfJava

Contribute to RUCKUSJERRY/practiceOfJava development by creating an account on GitHub.

github.com