https://school.programmers.co.kr/learn/courses/30/lessons/17679

구현량이 너무 많다 예외처리 신경쓸것도 너무 많고
어떻게 구현해야할지 고민하다가 시간이 다간다;;

알파벳은 숫자로 변환하였다
이차원 int 배열로 받았다

while문 돌면서 지울게 없을때 멈춘다

이차원배열 돌리면서
2x2 찾고 지우는 처리하고 재배열 처리한다

import java.util.*;

class Solution {
    public int solution(int m, int n, String[] board) {
        int answer = 0;

        int[][] pan = new int[m][n];
        int[][] delpan = new int[m][n];
        for(int i = 0; i < m; ++i)
        {
            for(int j = 0;j < n; ++j)
            {
                pan[i][j] = board[i].charAt(j)-'A';
            }
        }

        int[][] dir = {{0, 1},{1, 0},{1, 1}};//r, d, rd

        while(true)//더 지워질게 없을때까정 반복
        {
            //delpan 에 지워질 대상 기록
            for(int i = 0; i < m; ++i)
            {
                for(int j = 0;j < n; ++j)
                {
                    if(pan[i][j] == -1)//빈공간
                        continue;

                    boolean twobytwo = true;//2x2 있나?
                    for(int k = 0; k < 3; ++k)
                    {
                        int row = i+dir[k][0];
                        int col = j+dir[k][1];

                        if(row >= m || col >= n)
                        {
                            twobytwo = false;
                            break;
                        }

                        if(pan[i][j] != pan[row][col])
                        {
                            twobytwo = false;
                            break;
                        }
                    }
                    if(twobytwo)
                    {
                        delpan[i][j] = -1;
                        for(int k = 0; k < 3; ++k)
                        {
                            int row = i+dir[k][0];
                            int col = j+dir[k][1];

                            delpan[row][col] = -1;
                        }
                    }
                }
            }

            //pan 으로 delpan을 복사
            boolean existDel = false;
            for(int i = 0; i < m; ++i)
            {
                for(int j = 0;j < n; ++j)
                {
                    if(delpan[i][j] == -1)
                    {
                        pan[i][j] = -1;
                        delpan[i][j] = 0;
                        existDel = true;
                    }
                }
            }


            if(false == existDel)//2x2가 없으면 종료
            {
                //지워진 개수
                for(int i = 0; i < m; ++i)
                {
                    for(int j = 0;j < n; ++j)
                    {
                        if(-1 == pan[i][j])
                            answer++;
                    }
                }
                break;
            }

            //재배열
            for(int i = m-1; i > m-2; --i)
            {
                for(int j = 0;j < n; ++j)
                {
                    int down = i;
                    int up = down;
                    while(up >= 0)
                    {
                        if(pan[up][j] == -1)
                        {
                            up--;
                        }
                        else
                        {
                            if(down != up)
                            {
                                int temp = pan[up][j];
                                pan[up][j] = pan[down][j];
                                pan[down][j] = temp;
                            }

                            down--;
                            up--;
                        }

                    }
                }
            }



        }

        return answer;
    }


}
profile
게임개발자 백엔드개발자

0개의 댓글