프로그래머스 프렌즈4블록 Java - 2018 카카오 블라인드 채용

문제

주어진 문자열을 2차원 배열로 옮긴 후에 2x2 의 정사각형안에 모든 문자가 동일한 모든 블록이 한번에 터지고 그 위에 블록들이 아래로 이동한다. 이 때 터진 블록의 총 갯수를 구하라

접근

풀이

1번

public int solution(int m, int n, String[] board) {
    int answer = 0;
    char [][] map = new char[m][n];

    for(int i=0 ; i<m ; i++) {
        map[i] = board[i].toCharArray();
    }

    while(true) {
        int cnt = 0;

        boolean [][] isVisited = new boolean[m][n];

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

                if(map[i][j] == map[i][j+1] && map[i][j+1] == map[i+1][j+1] && map[i+1][j+1] == map[i+1][j]) {
                    cnt += check(i,j, map, isVisited);
                }
            }
        }

        if(cnt == 0) {
            break;
        } else {
            answer += cnt;
            move(isVisited, map, m, n);
        }
    }

    return answer;
}

public int check(int x, int y, char [][] map, boolean [][] isVisited) {
    int res = 4;

    if(isVisited[x][y]) res--;
    if(isVisited[x+1][y]) res--;
    if(isVisited[x][y+1]) res--;
    if(isVisited[x+1][y+1]) res--;

    isVisited[x][y] = true;
    isVisited[x+1][y] = true;
    isVisited[x][y+1] = true;
    isVisited[x+1][y+1] = true;

    return res;
}

public void move(boolean [][] isVisited, char [][] map, int m, int n) {
    for(int j=0 ; j<n ; j++) {
        for(int i=m-1 ; i>=0 ; i--) {
            if(isVisited[i][j] == true) {
                map[i][j] = '0';

                for(int k=i-1 ; k>=0 ; k--) {
                    if(isVisited[k][j] == false) {
                        char temp = map[i][j];
                        map[i][j] = map[k][j];
                        map[k][j] = temp;

                        boolean isTemp = isVisited[i][j];
                        isVisited[i][j] = isVisited[k][j];
                        isVisited[k][j] = isTemp;
                        break;
                    }
                }
            }
        }

    }
}

이 문제는 요구사항을 코드로 옮길 수 있는가를 물어보는 문제이다. 이러한 문제형태를 백준에서는 시뮬레이션이라고 분류한다. 예외사항과 정확한 구현을 필요로하기에 알고리즘 문재애 있어서 기본기를 닦을 수 있는 문제라 생각한다.

결론



Related Posts