| 문제 출처 | 제목 | 난이도 |
|---|
| 2019 카카오 개발자 겨울 인턴십 | 크레인 인형뽑기 게임 | Lv.1 |
크레인 인형뽑기 게임
해결코드:
import java.util.*;
class Solution {
public int solution(int[][] board, int[] moves) {
int answer = 0;
Stack<Integer> stack = new Stack<>();
stack.push(0);
for(int i=0; i<moves.length; i++){
for(int j=0; j<board.length; j++){
if(board[j][moves[i] - 1] != 0){
if(stack.peek() == board[j][moves[i] - 1]){
stack.pop();
answer+=2;
}else{
stack.push(board[j][moves[i] - 1]);
}
board[j][moves[i] - 1] = 0;
break;
}
}
}
return answer;
}
}
고민의 시간과 해결 방법:
- 카카오 출신 문제답게 지문도 길고 구현보다 이해하는데 시간이 더 걸린 문제이다.
- 오른쪽 바구니는 스택형태를 띄고있다. 따라서 이를 담아줄 스택 자료구조를 하나 생성한다.
- 주어진 moves 배열 길이만큼 순회를 하면서 주어진 문제를 해결할 로직을 실행하면된다. 따라서 moves.length만큼 배열을 순회한다
- 이어서 board의 크기만큼 순회하는데, 이 문제에서 주의할점은 배열의 입력은 좌에서 우이고, moves의 숫자는 열을 의미한다.
- moves의 숫자가 1이면 1열에 해당하는 숫자만 탐색하면 된다. 따라서 이중 포문이 아니라 한줄만 순회하면 된다
- 그리고 해당하는 열의 행들을 탐색해야 하므로 일반적인 순회인 board[i][j]가 아니라 board[j][i] 형태를 띄어야 한다
- board를 탐색하면서 만약 0이 아니라면 인형이 있는 것이다. 따라서 인형이 있다면 스택의 있는 peek 값과 비교해서 같다면 pop해주고 answer에 2를 더해준다. 만약 다르면 해당 위치의 값을 스택에 push해준다
- 그리고 해당 위치는 0으로 바꿔줘서 인형이 없음을 나타내고 break한다.
- 완성한 answer을 return하면 정답이다.
학습정리
- 문제 이해를 잘하려면 주어진 상황과 조건별로 분할해서 정리할 필요가 있을 것 같다. 최대한 그림과 주석을 통해 정리하는 습관을 기르도록 하자
- 여러 문제를 풀면서 비슷한 패턴을 익히는 것이 가장 중요하고, 카카오 급의 코테를 잘 풀려면 아이디어를 잘 캐치하는 것도 중요한 것 같다. 문제마다 최소한의 고민 시간을 꼭 가지고 (최대 30분) 여러 문제를 풀면서 아이디어 캐치 및 구현 능력을 키우자!
문제 링크:
크레인 인형 뽑기 게임