프로그래머스 Lv.2 2018 KAKAO BLIND RECRUITMENT [1차] 프렌즈4블록
입력으로 블록의 첫 배치가 주어졌을 때, 지워지는 블록의 개수를 return하는 solution함수를 작성하는 문제이다. 블록은 2x2형태로 4개가 붙어있을 경우 지워진다.
import java.util.ArrayList;
class Solution {
public int solution(int m, int n, String[] board) {
int answer = 0;
char[][] cboard = new char[m][n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
cboard[i][j] = board[i].charAt(j);
}
}
boolean[][] bboard = new boolean[m][n];
boolean deleted = true;
while(deleted) { // 지워질 블록이 없을 때까지 반복
// 블록 찾기 전 bboard를 false로 초기화
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
bboard[i][j] = false;
}
}
// 지워질 블록 찾기
for (int i = 0; i < m-1; i++) {
for (int j = 0; j < n-1; j++) {
char target = cboard[i][j];
if (target != '0'
&& target == cboard[i][j+1] && target == cboard[i+1][j+1] && target == cboard[i+1][j]) {
bboard[i][j] = true;
bboard[i][j+1] = true;
bboard[i+1][j+1] = true;
bboard[i+1][j] = true;
}
}
}
// 지워진 블록이 없으면(=모든 블록이 false면) while문을 끝냄
deleted = false;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (bboard[i][j]) {
answer++;
deleted = true;
}
}
}
// 블록 지우기
for (int i = 0; i < n; i++) {
ArrayList<Character> list = new ArrayList<Character>();
for (int j = m - 1; j >= 0; j--) {
if(!bboard[j][i]) { // bboard[j][i]가 false이면 list에 add
list.add(cboard[j][i]);
}
cboard[j][i] = '0';
}
int len = list.size();
for (int j = m - 1, k = 0; j >= m - len && k < len; j--, k++) {
cboard[j][i] = list.get(k); // list에 저장된 값 꺼내서 cboard에 저장
}
}
}
return answer;
}
}