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