알고리즘
프로그래머스 프랜즈 4블록
오래먹는오레오
2021. 1. 14. 15:57
프랜즈 4블록 : programmers.co.kr/learn/courses/30/lessons/17679
코딩테스트 연습 - [1차] 프렌즈4블록
프렌즈4블록 블라인드 공채를 통과한 신입 사원 라이언은 신규 게임 개발 업무를 맡게 되었다. 이번에 출시할 게임 제목은 프렌즈4블록. 같은 모양의 카카오프렌즈 블록이 2×2 형태로 4개가 붙
programmers.co.kr
블록이 2X2형태로 4개가 붙어 있는경우 사라지게 하여 점수를 얻는 게임이다
2X2모양이 여러개 있다면 한꺼번에 지워지며 지워진 빈자리에는 윗칸의 블록이 내려와 채워진다.
이때 총지워진 블록의 갯수를 구하는 문제이다.
이건뭐... 시뮬이라 딱히 말할께 없다;;;
import java.util.*;
class Solution {
public int[] movy = { 0, 1, 1 }, movx = { 1, 1, 0 };
public int solution(int m, int n, String[] board) {
int answer = 0;
char[][] cArr = new char[board.length][board[0].length()];
for (int l = 0; l < board.length; l++) {
cArr[l] = board[l].toCharArray().clone();
}
answer = StartGame(cArr);
return answer;
}
private int StartGame(char[][] cArr) {
int eraseBlock = 0, cLen = cArr.length, rLen = cArr[0].length;
char[][] tempArr = new char[cLen][rLen];
for (int l = 0; l < cLen; l++) {
System.arraycopy(cArr[l], 0, tempArr[l], 0, rLen);
}
// 블록 없애는 작업
for (int cl = 0; cl < cLen; cl++) {
for (int rl = 0; rl < rLen; rl++) {
if (cArr[cl][rl] != ' ') {
for (int i = 0; i < 3; i++) {
int newY = cl + movy[i];
int newX = rl + movx[i];
if (outOfBound(newY, newX, rLen, cLen) || cArr[cl][rl] != cArr[newY][newX]) {
break;
}
if (i == 2) {
if (tempArr[cl][rl] != ' ') {
tempArr[cl][rl] = ' ';
eraseBlock++;
}
if (tempArr[cl][rl + 1] != ' ') {
tempArr[cl][rl + 1] = ' ';
eraseBlock++;
}
if (tempArr[cl + 1][rl] != ' ') {
tempArr[cl + 1][rl] = ' ';
eraseBlock++;
}
if (tempArr[cl + 1][rl + 1] != ' ') {
tempArr[cl + 1][rl + 1] = ' ';
eraseBlock++;
}
}
}
}
}
}
if (eraseBlock == 0) {
return eraseBlock;
}
// 블록 내리는 작업
return eraseBlock + StartGame(downBlock(tempArr));
}
private char[][] downBlock(char[][] cArr) {
int cLen = cArr.length, rLen = cArr[0].length;
for (int rl = 0; rl < rLen; rl++) {
int offset = cLen - 1, offset2 = cLen - 1;
while (true) {
while (offset > -1 && cArr[offset][rl] != ' ') {
offset--;
}
offset2 = offset;
while (offset2 > -1 && cArr[offset2][rl] == ' ') {
offset2--;
}
if (offset2 <= -1) {
break;
} else {
cArr[offset][rl] = cArr[offset2][rl];
cArr[offset2][rl] = ' ';
}
}
}
return cArr;
}
private boolean outOfBound(int y, int x, int xLimit, int yLimit) {
if (y < 0 || y >= yLimit || x < 0 || x >= xLimit) {
return true;
}
return false;
}
}