[programmers] 크레인 인형뽑기 게임
1. 문제 Link
2. 문제 설명
문제 Link를 참고하세요.
3. 제한 사항
- board 배열은 2차원 배열로 크기는 “5 x 5” 이상 “30 x 30” 이하입니다.
- board의 각 칸에는 0 이상 100 이하인 정수가 담겨있습니다.
- 0은 빈 칸을 나타냅니다.
- 1 ~ 100의 각 숫자는 각기 다른 인형의 모양을 의미하며 같은 숫자는 같은 모양의 인형을 나타냅니다.
- moves 배열의 크기는 1 이상 1,000 이하입니다.
- moves 배열 각 원소들의 값은 1 이상이며 board 배열의 가로 크기 이하인 자연수입니다.
4. 입출력 예
board | moves | result |
---|---|---|
[[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 |
5. 코드 해설
- 인형을 옮겨 담을 temp 배열을 선언합니다. Stack 자료구조를 사용해도 좋습니다.
- 전달받은 move 배열만큼 반복 수행합니다.
- 인형을 보드 배열에서 꺼내기 위한 search 메소드를 호출합니다.
- 인형 보드 배열과 인형을 꺼낼 위치를 전달하면 가장 위에 있는 인형을 전달합니다.
- 인형이 없으면 0을 반환합니다.
- 인형을 꺼낸 위치는 0으로 변경합니다.
- 인형을 꺼내지 못했다면 다음 move를 수행합니다.
- search 메소드를 통해 꺼낸 인형과 temp 배열 가장 위에 존재하는 인형이 동일한지 비교합니다.
- 동일하면 2개의 인형이 없어지므로 answer 값을 2 증가시킵니다.
- temp 배열의 맨 위를 가르키는 pos 값을 1 감소시킵니다.
- 동일하지 않으면 맨 위에 temp 배열 맨 뒤에 인형 값을 전달하고 pos 값을 1 증가시킵니다.
- aswer를 반환합니다.
6. 제출 코드
class Solution {
public int search(int[][] board, int move) {
int result = 0;
int rowLength = board.length;
// 위에서부터 탐색
for (int row = 0; row < rowLength; row++) {
int character = board[row][move];
if (character != 0) {
board[row][move] = 0;
result = character;
break;
}
}
return result;
}
public int solution(int[][] board, int[] moves) {
int answer = 0;
int pos = 0;
int[] temp = new int[901];
int movesLength = moves.length;
for (int index = 0; index < movesLength; index++) {
int move = moves[index];
int character = search(board, move - 1);
if (character == 0) {
continue;
}
if (temp[pos] == character) {
answer += 2;
temp[pos] = 0;
pos--;
} else {
temp[pos + 1] = character;
pos++;
}
}
return answer;
}
}
댓글남기기