프로그래머스 - (Java) 프렌즈4블록
알고리즘/프로그래머스

프로그래머스 - (Java) 프렌즈4블록

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

 

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

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

programmers.co.kr

1. 유형

시뮬레이션

 

2. 로직

 

1) 2*2부분 빈칸으로 바꾸기

2) 빈칸만큼 아래로 내리기

3) 위의 조건을 반복

 

이 문제에서 그나마 구현이 어려운 부분이 빈칸만큼 내리는 코드다.

 

3. 코드

import java.util.*;
class Solution {
    static char table[][];
    static boolean visited[][];
    public int solution(int n, int m, String[] board) {
        int answer = 0;
        int flag = 0;
        table = new char[n][m];
        for(int i=0; i<n; i++){
            table[i] = board[i].toCharArray();
        }
        while(true){
            flag=0;
            visited = new boolean[n][m];
            for(int i=0; i<n-1; i++){
                for(int j=0; j<m-1; j++){
                    flag+=checkMatrix(i, j);
                }
            }
            if(flag==0) break;
            for(int j=0; j<m; j++){
                ArrayList<Character> list = new ArrayList<>();
                for(int i=n-1; i>=0; i--){
                    if(!visited[i][j]){
                        list.add(table[i][j]);
                    }else
                        answer++;
                }
                for(int i=n-1, idx=0; i>=0; i--, idx++){
                    if(idx<list.size()){
                        table[i][j] = list.get(idx);
                    }else{
                        table[i][j] = '0';
                    }
                }
            }
        }
        return answer;
    }
    static int checkMatrix(int r, int c){
        char target = table[r][c];
        if(target!='0' && target==table[r+1][c] && target==table[r][c+1] && target==table[r+1][c+1]){
            visited[r][c]=true;
            visited[r+1][c]=true;
            visited[r][c+1]=true;
            visited[r+1][c+1]=true;
            return 1;
        }
        return 0;
    }
}
/*
1. 2*2 체크
2. 아래로 내리기
    - 맨 아래서부터 탐색, false인것만 동적배열에 넣기
    - 동적배열에서 끄내면서 다시 쌓기
*/