코딩테스트/Java

(2021카카오) 프렌즈4블록 Java

SK_MOUSE 2021. 2. 23. 16:01
반응형

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

다음은 코드의 변수선언 설명이다.

 

기본 board 를 2차원 배열로 변환한 배열=> grid[m][n]

한 시행으로 동시에 삭제해야될 것들 위치 저장할 배열 => check[m][n]

 

1. board배열을 2차원배열로 변환한다.

m=5, n=5인 grid

2. 우선 (i,j)의 위치에서 (i,j+1),(i+1,j),(i+1,j+1)에 있는 것과 일치하면 check배열에 true로 위치를 기록한다.

 

3. 다음은 check배열을 순회하는데, 각 열별로 순회를하면서 지우지않아도 되는값만을 Queue에 넣어서 저장해놓는다.

동시에 check=true인 부분은 answer++를 해준다.

4번 시행=>@는 공백을 의미한다.

4. 저장해놓은 Queue를 poll()하면서 배열을 아래부터 채워올라오고, Queue.size()가 0이면 그부분부터 윗부분까지는 '@'로 채워준다. 

5번을 통해 전체 순환을 반복한다.

5. 이 시행을 answer값이 반복문에서 처음과 같은지를 비교하며 break할지 마지막에 체크한다.

 

5번에서 더이상 지울것이 없어서 answer=semiAnswer인 경우 break 되었을때의 상태

 

import java.util.LinkedList;
import java.util.Queue;

class Solution {
    public int solution(int m, int n, String[] board) {
        int answer = 0;
        char[][] grid = new char[m][n];
        boolean[][] check;
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                grid[i][j] = board[i].charAt(j);
            }
        }
        while(true) {
            int semiAnswer= answer;
            check = new boolean[m][n];
            for (int i = 0; i < m - 1; i++) {//높이
                for (int j = 0; j < n - 1; j++) {//폭
                    //(i,j)위치에서 사각형이면
                    if (grid[i][j]!='@'
                            &&grid[i][j] == grid[i][j + 1]
                            && grid[i][j] == grid[i + 1][j]
                            && grid[i][j] == grid[i + 1][j + 1]) {
                        check[i][j] = true;
                        check[i][j + 1] = true;
                        check[i + 1][j] = true;
                        check[i + 1][j + 1] = true;
                    }
                }
            }
            for (int j = 0; j < n; j++) {
                Queue<Character> queue = new LinkedList<>();
                for (int i = m - 1; i >= 0; i--) {
                    if (check[i][j] == false) {
                        queue.offer(grid[i][j]);
                        //System.out.print(" put:" + grid[i][j]);
                    } else {
                        answer++;
                    }
                }
                for (int i = m - 1; i >= 0; i--) {
                    if (queue.size() == 0) grid[i][j] = '@';
                    else {
                        grid[i][j] = queue.poll();
                    }
                }
            }
            if(answer==semiAnswer) break;
        }
        return answer;
    }
}
반응형