[프로그래머스] LEVEL2 [1차] 프렌즈4블록 JAVA

Pixel Dophin·2023년 8월 22일
0

프로그래머스

목록 보기
43/55

[1차] 프렌즈4블록

문제링크

풀이

구현
1. friendsBlock을 통해 한 사이클을 만들었다. 좀 더 살펴보면
먼저 블록의 삭제여부 확인을 위한 deleted를 만들었다.

1-1. (블록 삭제) 문제에 적힌 대로 카카오 프렌즈 블록 4개씩 붙어 있는 경우 삭제한다.
1-2. (빈공간 채우기) 각 열별로 밑에서 부터 삭제된 블록의 수를 세고 이를 통해 빈공간 위에 있는 블록들을 빈공간 만큼 아래로 움직여 빈공간을 채운다.
1-3. (점수구하기) drop의 맨 윗 행에는 각 열별로 사라진 블록의 개수가 저장되어 있으므로 맨 윗행의 drop[0]의 합을 구한다.
2. 위 1번 과정 후 얻은 점수가 0이 아니라면 다시 위 과정을 반복하여 블록을 삭제하고 점수를 얻는다.
0이라면, 더이상 점수를 얻을 수 없으므로 멈춘다.

코드

import java.util.*;
class Solution {
    
    public static int[] dx = {0, 1, 1};
    public static int[] dy = {1, 1, 0};
    
    public int m, n;
    public int solution(int m, int n, String[] board) {
        int answer = 0;
        this.m = m;
        this.n = n;
        
        char[][] kakaoBoard = new char[m][n];
        for (int i = 0; i < m; i++) {
            kakaoBoard[i] = board[i].toCharArray();
        }
        
        int cnt = 1;
        while (cnt != 0) {
            cnt = friendsBlock(kakaoBoard);
            answer += cnt;
        }
        
        
        return answer;
    }
    
    public int friendsBlock(char[][] board) {
        int answer = 0;
        boolean[][] deleted = new boolean[m][n];
        
        // 카카오 프렌즈 블록 4개씩 붙어 있는 경우 삭제
        for (int i = 0; i < m - 1; i++) {
            for (int j = 0; j < n - 1; j++) {
                boolean flag = true;
                char cur = board[i][j];
                if (cur == ' ') continue;
                
                for (int k = 0; k < 3; k++) {
                    int newi = i + dx[k];
                    int newj = j + dy[k];
                    if (cur != board[newi][newj]) {
                        flag = false;
                        break;
                    }
                }
                
                if (flag) {
                    deleted[i][j] = true;
                    for (int k = 0; k < 3; k++) {
                        int newi = i + dx[k];
                        int newj = j + dy[k];
                        deleted[newi][newj] = true;
                    }
                }
            }
        }
        
        int[][] drop = new int[m][n];
        // 블록 빈공간 채우기
        dropBlock(drop, deleted, board);
        
        // 점수 계산
        return getScore(drop);
    }
    
    public void dropBlock(int[][] drop, boolean[][] deleted, char[][] board) {
        for (int j = 0; j < n; j++) {
            for (int i = m - 1; i >= 0; i--) {
                int bef = i < m - 1 ? drop[i+1][j] : 0;
                int aft = deleted[i][j] ? 1 : 0;
                drop[i][j] = bef + aft;
                
                if (!deleted[i][j] && drop[i][j] > 0) {
                    board[i + drop[i][j]][j] = board[i][j];
                    board[i][j] = ' ';
                } else if (deleted[i][j]) {
                    board[i][j] = ' ';
                }
            }
        }
    }
    
    public int getScore(int[][] drop) {
        int score = 0;
        for (int j = 0; j < n; j++) {
            score += drop[0][j];
        }
        return score;
    }
}
profile
안녕 👋 성장하고픈 개발자 💻 입니다

0개의 댓글

관련 채용 정보