알고리즘/Lv2. 프로그래머스

[프로그래머스] 프렌즈4블록 -java

signal시노 2023. 8. 11. 21:02

출처 : 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;
    }
}

같은 블록들이 제거된 이후 떨어지는 액션을 어떻게 할지 고민 하다가 큐를 떠올려서 풀 수 있었습니다.