문제 출처 - Programmers
문제는 여기
[풀이]
1. moves에 해당하는 열의 가장 윗 행에 있는 값을 구한다.
2. 스택의 peek와 1에서 구한 값을 비교해
2-1. 같다면 스택의 값을 pop 하고 값을 2 증가시킨다.
2-2. 다르다면 스택에 넣어준다.
3. 1번에서 구한 값을 0으로 만들어준다.
[접근]
1. 문제를 보고 moves에 해당하는 열의 가장 윗 행에 있는 인형을 뽑는다고 이해를 하였다.
2. 뽑은 인형이 두 번 연속 같은 인형이라면 바구니에 담으며 터진다고 이해하였고 이전에 뽑은 인형을 체크하기 위해서 스택을 사용하면 편하겠다고 생각을 하였다.
[코드]
import java.util.*;
class Solution {
public int solution(int[][] board, int[] moves) {
int answer = 0;
Stack<Integer> st = new Stack<>(); // 뽑은 인형을 담아둘 스택
for (int i = 0; i < moves.length; i++) {
// moves배열은 1부터 시작하도록 되어있지만 배열은 0부터이므로 -1
int pos = moves[i] - 1;
// 행의 수만큼 반복
for (int j = 0; j < board.length; j++) {
// 해당하는 위치가 0이 아니라면 인형이 있다는 것
if (board[j][pos] != 0) {
// 스택이 비어있지 않고
// 스택의 맨 위가 현재 뽑은 인형이라면
if (!st.isEmpty() && st.peek() == board[j][pos]) {
st.pop(); // 스택의 맨 위를 빼주고
answer += 2; // 값을 2증가 (스택에 있던 것 + 이번에 뽑은 것)
}
else // 위가 다르면 뽑은 인형을 스택에 넣기
st.push(board[j][pos]);
// 현재 인형을 뽑았으니까 0으로 변경
board[j][pos] = 0;
break; // 맨 위에 있는 인형만 처리해야하므로 탈출
}
}
}
return answer;
}
}
'문제 풀이 > Programmers' 카테고리의 다른 글
[프로그래머스] 음양더하기 (JAVA) (0) | 2022.03.05 |
---|---|
[프로그래머스] 내적 (JAVA) (0) | 2022.03.04 |
[프로그래머스] 숫자 문자열과 영단어 (JAVA) (0) | 2022.03.04 |
[프로그래머스] 나누어 떨어지는 숫자 배열 (JAVA) (0) | 2022.03.02 |
[프로그래머스] 위장 (JAVA) (0) | 2022.02.28 |