https://programmers.co.kr/learn/courses/30/lessons/17679
문제 파악
문제의 의도는 아래의 사진과 같다.
애니팡 게임과 비슷하게
1. 2X2칸의 이모티콘이 모두 같으면 해당 칸을 지운다.
2. 지운 칸의 개수를 센다.
3. 지워진 이모티콘의 칸을 위에 있던 이모티콘이 내려와 빈자리를 채운다.
아마 비워진 칸으로 이모티콘을 이동시키는 부분을 깔끔하게 코딩 하고 싶어서 시간을 많이 쓴 거 같다
가독성 높은 코딩을 하려고 노력해야 되지 않을까
더보기
class Solution
{
static int answer = 0;
static char[][] puzzle;
public int solution(int m, int n, String[] board) {
boolean init = true;
puzzle = new char[m][n];
for(int r = 0; r<m; r++)
{
puzzle[r] = board[r].toCharArray();
}
while(init)
{
init = Find(puzzle,m,n);
}
return answer;
}
public boolean Find(char[][] puzzle,int m , int n)
{
int cnt = 0;
boolean[][] pang = new boolean[m][n];
for(int r = 0; r < m-1; r++)
{
for(int c = 0; c < n-1; c++)
{
int r1 = r+1;
int c1 = c+1;
if(puzzle[r][c] == 'X') continue;
if(puzzle[r][c] == puzzle[r1][c] && puzzle[r][c] == puzzle[r][c1] && puzzle[r][c] == puzzle[r1][c1])
{
pang[r][c] = true;
pang[r1][c] = true;
pang[r][c1] = true;
pang[r1][c1] = true;
}
}
}
for(int r = 0; r < m; r++)
{
for(int c = 0; c < n; c++){
if(pang[r][c])
{
puzzle[r][c] = 'X';
cnt++;
}
}
}
if(cnt == 0){
return false;
}
else {
answer+=cnt;
ArrayBatch(puzzle,m,n);
return true;
}
}
public void ArrayBatch(char[][] puzzle,int m , int n)
{
for(int c = 0; c < n; c++)
{
for(int r = m-2; r >= 0;r--)
{
moving(puzzle,r,c);
}
}
}
public void moving(char[][] puzzle , int r, int c)
{
while(true)
{
if(r+1>= puzzle.length || puzzle[r+1][c]!= 'X'){
break;
}
if(puzzle[r+1][c] == 'X'){
char ch = puzzle[r][c];
puzzle[r][c] = 'X';
puzzle[r+1][c] = ch;
}
r++;
}
}
}
'PS' 카테고리의 다른 글
[Programmers] LV2 - 스킬 트리 (0) | 2021.06.25 |
---|---|
[BOJ] 1022번: 소용돌이 예쁘게 출력하기 (0) | 2021.06.23 |
[BOJ]2638번 : 치즈 (0) | 2021.06.22 |
[BOJ]9328번 : 열쇠 (0) | 2021.06.21 |
[BOJ]14719번 : 빗물 (0) | 2021.06.20 |