반응형
다음은 코드의 변수선언 설명이다.
기본 board 를 2차원 배열로 변환한 배열=> grid[m][n]
한 시행으로 동시에 삭제해야될 것들 위치 저장할 배열 => check[m][n]
1. board배열을 2차원배열로 변환한다.
2. 우선 (i,j)의 위치에서 (i,j+1),(i+1,j),(i+1,j+1)에 있는 것과 일치하면 check배열에 true로 위치를 기록한다.
3. 다음은 check배열을 순회하는데, 각 열별로 순회를하면서 지우지않아도 되는값만을 Queue에 넣어서 저장해놓는다.
동시에 check=true인 부분은 answer++를 해준다.
4. 저장해놓은 Queue를 poll()하면서 배열을 아래부터 채워올라오고, Queue.size()가 0이면 그부분부터 윗부분까지는 '@'로 채워준다.
5. 이 시행을 answer값이 반복문에서 처음과 같은지를 비교하며 break할지 마지막에 체크한다.
import java.util.LinkedList;
import java.util.Queue;
class Solution {
public int solution(int m, int n, String[] board) {
int answer = 0;
char[][] grid = new char[m][n];
boolean[][] check;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
grid[i][j] = board[i].charAt(j);
}
}
while(true) {
int semiAnswer= answer;
check = new boolean[m][n];
for (int i = 0; i < m - 1; i++) {//높이
for (int j = 0; j < n - 1; j++) {//폭
//(i,j)위치에서 사각형이면
if (grid[i][j]!='@'
&&grid[i][j] == grid[i][j + 1]
&& grid[i][j] == grid[i + 1][j]
&& grid[i][j] == grid[i + 1][j + 1]) {
check[i][j] = true;
check[i][j + 1] = true;
check[i + 1][j] = true;
check[i + 1][j + 1] = true;
}
}
}
for (int j = 0; j < n; j++) {
Queue<Character> queue = new LinkedList<>();
for (int i = m - 1; i >= 0; i--) {
if (check[i][j] == false) {
queue.offer(grid[i][j]);
//System.out.print(" put:" + grid[i][j]);
} else {
answer++;
}
}
for (int i = m - 1; i >= 0; i--) {
if (queue.size() == 0) grid[i][j] = '@';
else {
grid[i][j] = queue.poll();
}
}
}
if(answer==semiAnswer) break;
}
return answer;
}
}
반응형
'코딩테스트 > Java' 카테고리의 다른 글
(2021카카오) 카드 짝 맞추기 Java (0) | 2021.03.11 |
---|---|
(2019카카오) 오픈채팅방 Java (0) | 2021.03.02 |
(2021카카오) 신규 아이디 추천 Java (0) | 2021.02.22 |
(2020카카오) 수식최대화 Java (0) | 2021.02.17 |
(2021카카오) 순위검색 Java (0) | 2021.02.11 |