본문 바로가기

알고리즘 풀이/프로그래머스

[프로그래머스] 프렌즈4블록 / 2018 KAKAO BLIND RECRUITMENT(1차) - JAVA

🔗 문제 링크

[프로그래머스] 프렌즈4블록 / 2018 KAKAO BLIND RECRUITMENT(1차)

 

코딩테스트 연습 - [1차] 프렌즈4블록

프렌즈4블록 블라인드 공채를 통과한 신입 사원 라이언은 신규 게임 개발 업무를 맡게 되었다. 이번에 출시할 게임 제목은 프렌즈4블록. 같은 모양의 카카오프렌즈 블록이 2×2 형태로 4개가 붙

programmers.co.kr

 

📝 풀이 과정

입력은 String 배열로 들어왔지만 코드의 편의성을 위해 char형의 이중 배열로 변경하였다
블록을 좌상단부터 시작해 탐색하며 좌우, 좌하, 우하의 칸이 모두 자신의 칸과 동일하면 제거하기 위한 nextBlock.으로 값을 변경하여 찍어주었다.

 

 

이후, 모두 제거가 된 블럭들로 생긴 빈칸을 채우기 위해 반복문을 통해 탐색하였다. 각 보드를 열을 기준으로 한줄씩 살펴보며 최하단부터 칸이 '.'일 때까지 위로 탐색하며 올라갔다. 만약 빈칸이 등장하면 해당칸에서 반복을 멈추었다.

 

 

이후, 다음 칸부터 빈칸이 아닌 블록으로 채워진 칸인지 다시 위로 올라가며 탐색하고 만약 블럭칸을 만나면 빈칸과 블럭칸을 교환해주는 방식으로 블록을 내려주었다.

 

💻 코드

class Solution {
    public int solution(int m, int n, String[] board) {
        char[][] blocks = new char[m][];
        for (int i = 0; i < m; i++)
            blocks[i] = board[i].toCharArray();

        int answer = 0;

        while (true) {
            char[][] nextBlocks = new char[m][];
            for (int i = 0; i < m; i++)
                nextBlocks[i] = blocks[i].clone();

            boolean ck = false;

            for (int i = 0; i < m - 1; i++) {
                for (int j = 0; j < n - 1; j++) {
                    if (blocks[i][j] == '.')
                        continue;

                    if (blocks[i][j] == blocks[i + 1][j] 
                          && blocks[i][j] == blocks[i][j + 1] 
                          && blocks[i][j] == blocks[i + 1][j + 1]) {
                        nextBlocks[i][j] = nextBlocks[i + 1][j] = nextBlocks[i][j + 1] = nextBlocks[i + 1][j + 1] = '.';
                        ck = true;
                    }
                }
            }
            if (!ck)
                break;

            for (int i = 0; i < m; i++)
                for (int j = 0; j < n; j++)
                    if (blocks[i][j] != nextBlocks[i][j])
                        answer++;


            for (int i = 0; i < n; i++) {
                int blank = m - 1;

                while (true) {
                    while (blank >= 0 && nextBlocks[blank][i] != '.')
                        blank--;

                    int block = blank;
                    while (block >= 0 && nextBlocks[block][i] == '.')
                        block--;

                    if (block < 0)
                        break;

                    nextBlocks[blank][i] = nextBlocks[block][i];
                    nextBlocks[block][i] = '.';
                }
            }
            blocks = nextBlocks;

        }

        return answer;
    }

}