ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [프로그래머스] 프렌즈 4블록 (2018 KAKAO BLIND RECRUITMENT)
    ALGORITHM/PROGRAMMERS 2021. 1. 5. 11:06

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

     

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

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

    programmers.co.kr

    2021-01-05


    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    public class Solution17679 {
        public static int N, M, answer;
        public static int dx[] = {011};
        public static int dy[] = {101};
        public static char arr[][];
        public static int map[][];
        public static boolean flag;
        
        public static void down() {
            for(int j = 0; j < M; j++) {
                loop:for(int i = N-1; i > 0; i--) {
                    if(arr[i][j] == ' ') {
                        for(int k = i-1; k >= 0; k--) {
                            if(arr[k][j] != ' ') {
                                arr[i][j] = arr[k][j];
                                arr[k][j] = ' ';
                                i--;
                            }
                        }
                        break loop;
                    }
                }
            }
            
        }
        
        public static void bomb() {
            for(int i = 0; i < N; i++) {
                for(int j = 0; j < M; j++) {
                    if(map[i][j] > 0) {
                        answer++;
                        arr[i][j] = ' ';
                    }
                }
            } 
        }
        
        public static void solve(int x, int y, int num) {
            int count = 0;
            for(int i = 0; i < 3; i++) {
                int nx = x + dx[i];
                int ny = y + dy[i];
     
                if(nx < 0 || ny < 0 || nx >= N || ny >= M) continue;
                if(arr[nx][ny] == arr[x][y]) {
                    count++;
                }
            }
            
            if(count == 3) {
                map[x][y] = num;
                for(int i = 0; i < 3; i++) {
                    int nx = x + dx[i];
                    int ny = y + dy[i];
                    map[nx][ny] = num;
                }
                flag = true;
            }
        }
        
        public static void init() {
            for(int i = 0; i < N; i++)
                for(int j = 0; j < M; j++)
                    map[i][j] = 0;
        }
        
        public static  int solution(int m, int n, String[] board) {
            answer = 0;
            N = m;
            M = n;
            arr = new char[N][M];
            map = new int[N][M];
            
            for(int i = 0; i < N; i++) {
                for(int j = 0; j < M; j++) {
                    arr[i][j] = board[i].charAt(j);
                }
            }
            
            while(true) {
                flag = false;
                int num = 1;
                init();
                for(int i = 0; i < N; i++) {
                    for(int j = 0; j < M; j++) {
                        if(arr[i][j] != ' ') {
                            solve(i, j, num++);
                        }
                    }
                }
                
                if(!flag) break;
                else {
                    bomb();
                    down();
                }
            }
            
            return answer;
        }
     
        public static void main(String[] args) {
            String[] bo = {"TTTANT""RRFACC""RRRFCC""TRRRAA""TTMMMF""TMMTTJ"};
            System.out.println(solution(66, bo));
        }
    }
     
    cs

     

    #문제풀이 

    1. String 1차원 배열의 입력값을 char 형태의 2차원 배열로 정리했다. 

    2. 먼저 하나의 기준점을 잡고 오른쪽, 오른쪽 대각선 아래, 아래를 체크한다. 3개 모두 기준점의 값과 같으면 2x2 블록이므로 제거하기 위해 map 배열에 번호를 체크를 한다.

    3. 판 하나를 다 돌고나서, 2x2 블럭이 하나라도 있었으면 기존 판에서 map으로 체크된 부분을 다 ' ' 상태로 바꾼다.

    4. 모두 터뜨리고 나서는 빈 공간을 채워야하므로 위에 있는 값들을 내려서 아래 빈 공간을 채운다.

    5. 2~4번을 2x2 블럭이 더 이상 없을 때까지 반복한다.

    댓글

Programming Diary