728x90
코드 힌트
- stack을 사용하기:
- 이유: Stack은 후입선출(LIFO, Last-In-First-Out) 구조를 가지며, 바구니의 맨 위에 있는 인형과 새로 뽑은 인형을 쉽게 비교할 수 있습니다. 인형을 뽑고 바구니에 넣거나, 바구니 맨 위의 인형을 제거하는 등의 작업을 효율적으로 수행할 수 있습니다.
- stack이 비어있을 때와 stack의 제일 위 요소가 동일할 때:
- stack이 비어있을 때:
- 바구니가 비어있는 경우, 현재 뽑은 인형을 바로 바구니에 추가합니다.
- stack의 제일 위 요소와 현재 뽑은 인형이 동일할 때:
- 바구니의 맨 위에 있는 인형과 새로 뽑은 인형이 동일하면, 두 인형이 터져서 사라지므로 바구니 맨 위의 인형을 제거하고, 사라진 인형의 수를 증가시킵니다.
- stack이 비어있을 때:
- result에는 stack.pop()을 했을 때 2개 추가하기:
- 이유: stack에서 pop()을 할 때, 바구니에서 두 개의 인형이 사라지기 때문입니다. 인형이 터질 때 항상 두 개씩 사라지므로 result에 2를 더해줍니다.
- 2중 for문을 사용할 때 배열에 접근하는 방법:
- 첫 번째 for문: moves 배열을 순회하며, 각 요소는 크레인이 작동할 열(column)을 나타냅니다.
- 두 번째 for문: 선택된 열의 맨 위에서부터 아래로 순회하여 인형을 찾습니다. board[i][line-1]을 통해 해당 열에서 인형을 탐색합니다. line-1을 사용하는 이유는 moves 배열의 값이 1부터 시작하기 때문에, 이를 0부터 시작하는 배열 인덱스로 맞춰주기 위해서입니다.
정답은 더보기 클릭
더보기
import java.util.*;
class Solution {
public int solution(int[][] board, int[] moves) {
// 정사각형 보드의 크기
int n = board.length;
// 터트려져 사라진 인형의 수를 저장할 변수
int result = 0;
// 인형을 담을 바구니 (Stack 자료구조 사용)
Stack<Integer> stack = new Stack<>();
// 크레인의 움직임을 나타내는 moves 배열을 순회
for (int line : moves) {
// 각 열(column)의 맨 위부터 인형을 찾기 위해 순회
for (int i = 0; i < n; i++) {
// 보드의 해당 위치가 비어있으면 (0이면) 다음 위치로 이동
if (board[i][line - 1] == 0) continue;
// 보드의 해당 위치가 비어있지 않으면 (인형이 있으면)
// 스택이 비어있을 때: 인형을 바구니에 추가
if (stack.isEmpty()) {
stack.push(board[i][line - 1]);
}
// 스택이 비어있지 않을 때: 바구니 맨 위의 인형과 현재 인형 비교
else if (stack.peek() == board[i][line - 1]) {
// 동일한 인형이면 바구니에서 제거하고 사라진 인형 수를 증가
stack.pop();
result += 2; // 인형 두 개가 사라지므로 +2
}
// 바구니 맨 위의 인형과 현재 인형이 다르면 바구니에 추가
else {
stack.push(board[i][line - 1]);
}
// 인형을 뽑았으므로 해당 위치를 0으로 변경
board[i][line - 1] = 0;
break; // 다음 moves 실행
}
}
// 최종적으로 사라진 인형의 수 반환
return result;
}
}
728x90
'프로그래머스(Java) > Level 1' 카테고리의 다른 글
[프로그래머스] 둘만의 암호 (0) | 2024.08.06 |
---|---|
[프로그래머스] [PCCE 기출문제] 9번 / 이웃한 칸 (0) | 2024.08.06 |
[프로그래머스] 키패드 누르기 (0) | 2024.08.05 |
[프로그래머스] 달리기 경주 (0) | 2024.08.02 |
[프로그래머스] 수박수박수박수박수박수? (0) | 2024.08.01 |