[Programmers]-[1차] 프렌즈4블록
문제
이런 블록이 있다고 보자. 같은 아이콘의 2x2블록을 모두 지운다. 중복되는것도 지운다. 그리고 빈부분은 나머지 윗블록들로 채워진다. 지워질것이 없을때까지 반복한다. 지워진 블록 모든 갯수를 리턴한다.
코드
import java.util.*;
class Solution {
public int solution(int m, int n, String[] board) {
int answer = 0;
boolean eraseBlock = true;//지울 블록 유무
String[][] clone = new String[m][n];//안보이는 데이터
String[][] map = new String[m][n];//실제보이는 데이터
for(int i=0;i<m;i++){//board를 2차원배열로 나타냄
map[i] = board[i].split("");
}
for(int i=0;i<m;i++){//map -> clone
for(int j=0;j<n;j++)
clone[i][j] = map[i][j];
}
while(eraseBlock){
eraseBlock = false;
for(int i=0;i<m-1;i++){
for(int j=0;j<n-1;j++){
String block = map[i][j];
if(block.equals(" ")) continue;
if(block.equals(map[i][j+1]) &&
block.equals(map[i+1][j]) &&
block.equals(map[i+1][j+1])){//4개붙어있을 경우
eraseBlock = true;
if(!clone[i][j].equals(" ")){
clone[i][j]=" ";
answer++;
}
if(!clone[i][j+1].equals(" ")){
clone[i][j+1]=" ";
answer++;
}
if(!clone[i+1][j].equals(" ")){
clone[i+1][j]=" ";
answer++;
}
if(!clone[i+1][j+1].equals(" ")){
clone[i+1][j+1]=" ";
answer++;
}
}
}
}//지워질 블록들이 지우기
for(int i=m-1;i>=1;i--){//빈공간 내리며채우기
for(int j=0;j<n;j++){
if(clone[i][j].equals(" ")){//빈공간일때
int empty = 1;//비워진부분 채울 위치 = i-empty
while(i-empty!=0 && clone[i-empty][j].equals(" ")){
empty++;//위쪽이 비어야하고, 맨윗줄이 아니면
}
clone[i][j] = clone[i-empty][j];
clone[i-empty][j] = " ";
}
}
}
for(int i=0;i<m;i++){//실제보이는부분에 옮기기
for(int j=0;j<n;j++)
map[i][j] = clone[i][j];//clone -> map
}
}//whileEnd
return answer;
}
}
코드 설명
board를 2차원배열 map으로 바꿔준다.
map을 clone으로 복제한다.
처음에 clone=map;
으로 복제했는데 주소를 가져와서 똑같은게 두개생겼다.
그래서 일일히 복제해준다.
나머지는 주석으로 충분히 이해 가능하다.
요약
- 코드가 긴문제는 오랫만이다.
- 이 코드로 직접 게임만들면 할만하겠다.