출처 : https://school.programmers.co.kr/learn/courses/30/lessons/17679
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
import java.util.*;
class Solution {
public int solution(int m, int n, String[] board) {
int answer = 0;
//블록이 제거되면 떨어져서 재정리 할 큐
Queue<String> q=new LinkedList<>();
String arr[][]=new String[m][n];
String newArr[][]=new String[m][n];
for(int i=0;i<m;i++){
String splitArr[]=board[i].split("");
for(int j=0;j<n;j++){
arr[i][j]=splitArr[j];
newArr[i][j]=splitArr[j];
}
}
while(true){
int check=0;
for(int i=0;i<m-1;i++){
for(int j=0;j<n-1;j++){
//블록의 오른쪽, 아래, 대각선이 같은 캐릭이라면 #으로 변환, 이미 #이라면 패스
if(arr[i][j].equals(arr[i][j+1])&&
arr[i][j].equals(arr[i+1][j])&&
arr[i][j].equals(arr[i+1][j+1])&&
!arr[i][j].equals("#")){
newArr[i][j]="#";
newArr[i+1][j]="#";
newArr[i][j+1]="#";
newArr[i+1][j+1]="#";
check++;
}
}
}
//#으로 변한게 없다면 while문 탈출
if(check==0) break;
int k=0;
int m2=m-1;
while(k<n){
//큐에 하나의 열을 역순으로 큐에 넣어줌
for(int i=m-1;i>=0;i--){
q.offer(newArr[i][k]);
}
//꺼낸 값이 #이라면 제거
//아니라면 꺼내서 다시 넣기
for(int i=0;i<newArr.length;i++){
if(q.peek().equals("#")){
q.remove();
} else{
q.offer(q.poll());
}
}
for(int i=m-1;i>=0;i--){
//비어있지 않다면 값 넣기
if(!q.isEmpty()){
newArr[i][k]=q.poll();
//비어있다면 #넣기
} else{
newArr[i][k]="#";
}
}
//다음 열로 이동
k++;
}
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
arr[i][j]=newArr[i][j];
}
}
}
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(arr[i][j].equals("#"))answer++;
}
}
return answer;
}
}
같은 블록들이 제거된 이후 떨어지는 액션을 어떻게 할지 고민 하다가 큐를 떠올려서 풀 수 있었습니다.
'알고리즘 > Lv2. 프로그래머스' 카테고리의 다른 글
[프로그래머스] 올바른 괄호 -java (0) | 2023.08.17 |
---|---|
[프로그래머스] 의상 -java (0) | 2023.08.17 |
기능개발 (0) | 2023.08.11 |
[프로그래머스] [3차] 파일명 정렬 - java (0) | 2023.07.28 |
[프로그래머스] 스킬트리 - java (0) | 2023.07.28 |