728x90
# 출처 : https://programmers.co.kr/learn/courses/30/lessons/64061
# 문제 요약
크레인에 들어있는 죠르디 인형을 moves 배열에 담긴 순서대로 뽑아, 바구니에 담는다.
바구니에 담긴 죠르디 인형들은 stack 형태로 들어가며, 이웃한 같은 인형들끼리는 터트려진다.
이때, 터트려진 인형의 개수를 return하는 문제
# 풀이
stack 사용
시간복잡도 : O(N*N)
# 코드
import java.util.Stack;
class Solution {
public static int solution(int[][] board, int[] moves) {
Stack<Integer> baguni = new Stack<Integer>(); // 바구니
final int N = board.length; // 크레인 크기
int M = moves.length; // 총 바구니에 들어가는 죠르디의 개수
for(int m: moves){
for(int i=0; i<N; i++) {
// 작동 위치에 해당하는 크레인 데이터를 위에서부터 확인
if(board[i][m-1]>0){
baguni.push(board[i][m-1]); // 바구니에 죠르디 넣음
board[i][m-1]=0; // 해당 위치 크레인 비우기
matchBaguni(baguni); // 바구니 안에 이웃한 같은 죠르디가 있다면, 터트리기
break;
}
// 크레인의 마지막 바닥까지 탐색해도,
// 죠르디가 없다면, 바구니에 담지 못했다는 의미이므로
// 총 바구니에 들어갔었던(?) 죠르디의 개수를 -1 줄임
if(i==N-1) M-=1;
}
}
// 총 바구니에 들어간 죠르디의 개수 - 바구니에 남아있는 죠르디 개수 = 터트린 죠르디 개수
return M - baguni.size();
}
/**
* 죠르디 터트리기
* - 바구니의 TOP, TOP-1에 위치한 죠르디가 같다면, 터트리기
* @param baguni: stack.push로 들어오는 죠르디
* */
public static void matchBaguni(Stack<Integer> baguni){
int prevIdx = baguni.size()-2;
// 바구니에 들어있는 죠르디 개수가 1이라면, prevIdx = -1 이므로 확인할 필요없음
if(prevIdx < 0) return;
if(baguni.peek() == baguni.get(prevIdx)){ // TOP, TOP-1 위치에 같은 죠르디인지 확인
// 터트리기
baguni.pop(); // 펑!
baguni.pop(); // 펑!
}
}
}
728x90
'algorithm > programmers' 카테고리의 다른 글
[programmers] 신규 아이디 추천(Java)_2021 KAKAO BLIND RECRUITMENT (1) | 2022.09.29 |
---|---|
[programmers] 신고 결과 받기(Java)_2022 KAKAO BLIND RECRUITMENT (0) | 2022.09.29 |
[programmers] [1차] 비밀지도(Java)_2018 KAKAO BLIND RECRUITMENT (0) | 2022.08.30 |
[programmers] 두 개 뽑아서 더하기(Java)_월간 코드 챌린지 시즌1 (0) | 2022.06.28 |
[Programmers] 소수만들기 (Java)_Summer/Winter Coding(~2018) (0) | 2022.06.25 |