문제: https://school.programmers.co.kr/learn/courses/30/lessons/64061
1. 코드
import java.util.*;
class Solution {
public int solution(int[][] board, int[] moves) {
int answer = 0;
List <List<Integer>> BOARD = new ArrayList<>();
for(int i = 0; i < board.length; i++) {
List <Integer> temp = new ArrayList<>();
for(int j = 0; j < board.length; j++) {
if(board[j][i] != 0)
temp.add(board[j][i]);
}
BOARD.add(temp);
}
Stack<Integer> basket = new Stack<>();
for(int m : moves) {
if(BOARD.get(m - 1).isEmpty()) continue;
if(basket.isEmpty())
basket.push(BOARD.get(m - 1).remove(0));
else if(basket.peek() == BOARD.get(m - 1).get(0)) {
basket.pop();
BOARD.get(m - 1).remove(0);
answer += 2;
}
else
basket.push(BOARD.get(m - 1).remove(0));
}
return answer;
}
}
2. 설명
List <List<Integer>> BOARD = new ArrayList<>();
for(int i = 0; i < board.length; i++) {
List <Integer> temp = new ArrayList<>();
for(int j = 0; j < board.length; j++) {
if(board[j][i] != 0)
temp.add(board[j][i]);
}
BOARD.add(temp);
}
board의 열을 기준으로 List에 추가하여 BOARD 리스트를 초기화해줍니다. board의 값이 0인 아닌 데이터만 저장합니다.
Stack<Integer> basket = new Stack<>();
for(int m : moves) {
if(BOARD.get(m - 1).isEmpty()) continue;
if(basket.isEmpty())
basket.push(BOARD.get(m - 1).remove(0));
else if(basket.peek() == BOARD.get(m - 1).get(0)) {
basket.pop();
BOARD.get(m - 1).remove(0);
answer += 2;
}
else
basket.push(BOARD.get(m - 1).remove(0));
}
바구니 역할을 할 Stack을 생성한 뒤 moves에 저장된 board의 열 번호에 맞추어 BOARD 리스트에 해당 열에 데이터가 있다면 계속 진행하는데 basket이 비어있다면 board에서 열에 첫 번째로 있는 데이터를 제거한 것을 basket에 push합니다.
basket이 비어있지 않다면 basket의 peek 값과 board의 첫 번째 값이 동일하다면 두 개의 값이 제거되며 answer에는 2 증가됩니다. 만약 동일하지 않다면 basket이 비어있을 때와 같은 동작을 진행합니다.
3. 정리
- 스택을 적절하게 사용하자
출처: 프로그래머스 코딩 테스트 연습,
https://school.programmers.co.kr/learn/challenges
'컴퓨터 > 프로그래머스' 카테고리의 다른 글
프로그래머스 - 67256번: 키패드 누르기 [Java] (0) | 2023.08.12 |
---|---|
프로그래머스 - 155652번: 둘만의 암호 [Java] (0) | 2023.08.11 |
프로그래머스 - 160586번: 대충 만든 자판 [Java] (2) | 2023.08.09 |
프로그래머스 - 140108번: 문자열 나누기 [Java] (0) | 2023.08.08 |
프로그래머스 - 42576번: 완주하지 못한 선수 (0) | 2023.08.07 |