문제
문제 풀이
해당 문제에서 가장 이해하기 어려웠던건 단순 board의 순서이다. 2차배열로 5개로 주어지는데 낮은 수가 당연히 아래에 쌓일 것이라고 생각하고 접근했는데 결과가 나오지 않아 다시 확인해보니 내림차순으로 불러와야 제대로 문제를 풀 수 있었다.
int[][] board = {{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}};
{3, 5, 1, 3, 1}
{4, 2, 4, 4, 2}
{0, 2, 5, 0, 1}
{0, 0, 1, 0, 3}
{0, 0, 0, 0, 0}
board를 제대로 정리 했을 시 위와 같은 모습으로 쌓이게 된다
거기서 basket에 담아주면서 상단에있는 값과 같을 때 사라지게하고 결과 +2를 해주면 되는 문제이다.
나의 답안
public static int solution(int[][] board, int[] moves) {
int answer = 0;
ArrayList<Deque<Integer>> list = new ArrayList<>();
Deque<Integer> basket = new LinkedList<>();
for (int i = 0; i < board.length; i++) {
Deque<Integer> stack = new LinkedList<>();
list.add(stack);
}
for (int i = 0; i < board.length; i++) {
int idx = 0;
for (int j = 0; j < board[i].length; j++) {
list.get(idx++).push(board[i][j]);
}
}
move:for (int i = 0; i < moves.length; i++) {
int pop = 0;
while (pop == 0) {
if (list.get(moves[i]-1).size() == 0) continue move;
pop = list.get(moves[i]-1).pollLast();
}
if (basket.isEmpty()) {
basket.offerLast(pop);
} else if (basket.peekLast() == pop) {
basket.pollLast();
answer += 2;
} else {
basket.offerLast(pop);
}
}
return answer;
}
다른 답안
각 자리마다 자료구조로 담아 두는게 아닌 moves에서 나오는 값을 바로 계산하여 정리하는 식이다. 코드 간소화된 모습으로 괜찮아 보여서 참고하였다.
import java.util.Stack;
class Solution {
public int solution(int[][] board, int[] moves) {
int answer = 0;
Stack<Integer> stack = new Stack<>();
for (int move : moves) {
for (int j = 0; j < board.length; j++) {
if (board[j][move - 1] != 0) {
if (stack.isEmpty()) {
stack.push(board[j][move - 1]);
board[j][move - 1] = 0;
break;
}
if (board[j][move - 1] == stack.peek()) {
stack.pop();
answer += 2;
} else
stack.push(board[j][move - 1]);
board[j][move - 1] = 0;
break;
}
}
}
return answer;
}
}
'Programmers 문제풀이 > Lv.1' 카테고리의 다른 글
신규 아이디 추천 (0) | 2023.03.24 |
---|---|
문자열 나누기 (0) | 2023.03.24 |
[카카오 인턴] 키패드 누르기 (0) | 2023.03.24 |
옹알이 (2) (0) | 2023.03.23 |
카드 뭉치 (0) | 2023.03.23 |