728x90
SMALL
문제 이해
- 2x2 형식의 같은 그림이 나오면 해당 블럭은 터진다.
- 라인별로 터지는게 아니라 곂치는게 존재해도 그 형태가 2x2라면 터지기 때문에 2x3 도 가능 하고 다양한 형태로 터지기 가능하다.
- 한번 다 터지면 터진거 제외한 블럭이 내려오기 때문에 while 로 만들었고 터지는게 한개도 없다면 빠져 나오게 만들었다.
- 블럭의 개수는 30x30 이하이기에 이중for문을 돌려서 해당 좌표의 우측, 아래, 우측 대각선 아래 의 세가지 값이 같다면 터져야할 블럭의 대상으로 check 배열에 true 변경하였다.
- 터진 블럭을 제외하고 아래로 내려야 하기에 터트리고 값들을 stack에 담아 배열 끝부터 채워넣으면서 위와 같은 방식을 반복하게 만들었다.
import java.util.*;
class Solution {
public int solution(int m, int n, String[] board) {
int answer = 0;
char[][] orign = new char[m][n];
for(int i = 0; i < m; i++){
for(int j = 0; j < n; j++){
orign[i][j] = board[i].charAt(j);
}
}
while(true){
int cnt = 0;
boolean[][] check = new boolean[m][n];
for(int i = 0; i < m-1; i++){
for(int j = 0; j < n-1; j++){
if (orign[i][j] != '.' &&
orign[i][j] == orign[i + 1][j] &&
orign[i][j] == orign[i + 1][j + 1] &&
orign[i][j] == orign[i][j + 1]) {
check[i][j] = true;
check[i + 1][j] = true;
check[i][j + 1] = true;
check[i + 1][j + 1] = true;
cnt++;
}
}
}
if(cnt == 0) break;
for(int i = 0; i < n; i++){
Stack<Character> stack = new Stack<Character>();
for(int j = 0; j < m; j++){
if(!check[j][i]){
stack.push(orign[j][i]);
}
}
for(int j = m-1; j >= 0; j--){
if(!stack.isEmpty()){
orign[j][i] = stack.pop();
}else{
orign[j][i] = '.';
}
}
}
}
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (orign[i][j] == '.') {
answer++;
}
}
}
return answer;
}
}
728x90
LIST
'자바 > 코딩테스트' 카테고리의 다른 글
[프로그래머스] 거리두기 확인하기 - Java(자바) (0) | 2024.05.21 |
---|---|
[프로그래머스] 괄호 변환 -Java(자바) (0) | 2024.05.13 |
[프로그래머스] 단어 변환 - Java(자바) (1) | 2024.04.12 |
[프로그래머스] 삼각 달팽이 - Java(자바) (0) | 2024.04.09 |
[프로그래머스] 무인도 여행 -Java(자바) (0) | 2024.04.08 |