티스토리 뷰

728x90

완전 깡구현 문제.

터진 공간을 찾아 위에서부터 블럭을 끌어와 채우는 방식이 평소에 생각해보지 못 한 방식이라 재밌었다.

 

이번에도 역시 2차원 배열을 다룰때 인덱스때문에 꽤 애를 먹었는데

0, 0에서 시작하는 순회 이외에 다른 방식으로 순회하는 방법 연습을 더 해야할듯하다.

 

import java.util.*;

class Solution {
    char[][] matrix;
    List<Integer> yList = new ArrayList<>();
    List<Integer> xList = new ArrayList<>();
    void squareFinder(int i, int j) {
        var pos = matrix[i][j];
        if (pos == matrix[i + 1][j] &&
           pos == matrix[i][j + 1] &&
           pos == matrix[i + 1][j + 1]) {
            yList.add(i); yList.add(i + 1); yList.add(i); yList.add(i + 1);
            xList.add(j); xList.add(j); xList.add(j + 1); xList.add(j + 1); 
        }
    }
    void moveBlockToBottom(int i, int j) {
        if (matrix[i][j] == '0') {
            var idx = i;
            while (idx-- > 0) {
                //터진 공간 위에 블럭이 있으면
                if (matrix[idx][j] != '0') {
                    matrix[i][j] = matrix[idx][j];
                    matrix[idx][j] = '0';
                    break;
                }
            }
        }
    }
    public int solution(int m, int n, String[] board) {
        int answer = 0;
        matrix = new char[m][n];
        for (var i = 0; i < board.length; i++) {
            matrix[i] = board[i].toCharArray();
        }
        while (true) {
            //2X2 찾기
            for (var i = 0; i < matrix.length - 1; i++) {
                for (var j = 0; j < matrix[0].length - 1; j++) {
                    if (matrix[i][j] == '0') continue;
                    squareFinder(i,j);
                }
            }
            //2X2가 발견되지 않으면 answer 반환.
            if (yList.size() == 0) return answer;
            //점수 계산
            for (var i = 0; i < yList.size(); i++) {
                if (matrix[yList.get(i)][xList.get(i)] == '0') continue;
                    matrix[yList.get(i)][xList.get(i)] = '0';
                    answer++;
            }
            yList.clear();
            xList.clear();
            //y값 밑으로 내리기.
            //x축을 먼저 돌며 y축의 아래서부터 터진 공간이 있는지 확인.
            for (var j = 0; j < n; j++) {
                for (var i = m - 1; i >= 0; i--) {
                    //터진 공간을 발견하면
                    moveBlockToBottom(i, j);
                }
            }
        }
        
    }
}
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함