코딩테스트/Java

(2021카카오) 프렌즈4블록 Java

SK_MOUSE 2021. 2. 23. 16:01

https://programmers.co.kr/learn/courses/30/lessons/17679

다음은 코드의 변수선언 설명이다.

 

기본 board 를 2차원 배열로 변환한 배열=> grid[m][n]

한 시행으로 동시에 삭제해야될 것들 위치 저장할 배열 => check[m][n]

 

1. board배열을 2차원배열로 변환한다.

m=5, n=5인 grid

2. 우선 (i,j)의 위치에서 (i,j+1),(i+1,j),(i+1,j+1)에 있는 것과 일치하면 check배열에 true로 위치를 기록한다.

 

3. 다음은 check배열을 순회하는데, 각 열별로 순회를하면서 지우지않아도 되는값만을 Queue에 넣어서 저장해놓는다.

동시에 check=true인 부분은 answer++를 해준다.

4번 시행=>@는 공백을 의미한다.

4. 저장해놓은 Queue를 poll()하면서 배열을 아래부터 채워올라오고, Queue.size()가 0이면 그부분부터 윗부분까지는 '@'로 채워준다. 

5번을 통해 전체 순환을 반복한다.

5. 이 시행을 answer값이 반복문에서 처음과 같은지를 비교하며 break할지 마지막에 체크한다.

 

5번에서 더이상 지울것이 없어서 answer=semiAnswer인 경우 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; ​​​​} }
반응형