자바/코딩테스트

[프로그래머스] [1차] 프렌즈4블록 - Java(자바)

대전집주인 2024. 4. 26. 17:30
728x90
SMALL

 

문제 이해

  • 2x2 형식의 같은 그림이 나오면 해당 블럭은 터진다.
  • 라인별로 터지는게 아니라 곂치는게 존재해도 그 형태가 2x2라면 터지기 때문에 2x3 도 가능 하고 다양한 형태로 터지기 가능하다.
  • 한번 다 터지면 터진거 제외한 블럭이 내려오기 때문에 while 로 만들었고 터지는게 한개도 없다면 빠져 나오게 만들었다.
  • 블럭의 개수는 30x30 이하이기에 이중for문을 돌려서 해당 좌표의 우측, 아래, 우측 대각선 아래 의 세가지 값이 같다면 터져야할 블럭의 대상으로 check 배열에 true 변경하였다.
  • 터진 블럭을 제외하고 아래로 내려야 하기에 터트리고 값들을 stack에 담아 배열 끝부터 채워넣으면서 위와 같은 방식을 반복하게 만들었다.
import java.util.*;
class Solution {
    public int solution(int m, int n, String[] board) {
        int answer = 0;
        char[][] orign = new char[m][n];
        
        for(int i = 0; i < m; i++){
            for(int j = 0; j < n; j++){
                orign[i][j] = board[i].charAt(j);
            }
        }
        
        while(true){
            int cnt = 0;
            boolean[][] check = new boolean[m][n];
            for(int i = 0; i < m-1; i++){
                for(int j = 0; j < n-1; j++){
                    if (orign[i][j] != '.' &&
                            orign[i][j] == orign[i + 1][j] &&
                            orign[i][j] == orign[i + 1][j + 1] &&
                            orign[i][j] == orign[i][j + 1]) {
                        check[i][j] = true;
                        check[i + 1][j] = true;
                        check[i][j + 1] = true;
                        check[i + 1][j + 1] = true;
                        cnt++;
                    }
                }
            }
            
            if(cnt == 0) break;
            
            for(int i = 0; i < n; i++){
                Stack<Character> stack = new Stack<Character>();
                for(int j = 0; j < m; j++){
                    if(!check[j][i]){
                        stack.push(orign[j][i]);
                    }
                }
                
                for(int j = m-1; j >= 0; j--){                                        
                    if(!stack.isEmpty()){
                        orign[j][i] = stack.pop();    
                    }else{
                        orign[j][i] = '.';
                    }
                }
            }
        }
        
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (orign[i][j] == '.') {
                    answer++;
                }
            }
        }
        
        return answer;
    }
}
728x90
LIST