[프렌즈 4블록]
https://programmers.co.kr/learn/courses/30/lessons/17679
* 로직
- (0,0)부터 기준점을 한 칸씩 이동하며 2*2만큼의 크기만큼을 비교한다
- 모두 같은 캐릭터라면 캐릭터들의 좌표 정보를 리스트에 담는다(removeInfo)
- 기준점을 모두 돌고난 뒤에, 삭제할 캐릭터들의 정보가 존재한다면
- 각각의 위치를 지워준다
- 캐릭터들을 재배치한다
- 만약 존재하지 않는다면 -> 반복을 종료한다
import java.util.LinkedList;
class Position_17679 {
public int y,x;
public Position_17679(int y, int x) {
this.y = y;
this.x = x;
}
}
class Solution {
static int M, N;
static int DivideSize = 2;
static String[][] Map;
public int solution(int m, int n, String[] board) {
int answer = 0;
M = m;
N = n;
Map = new String[M][N];
for(int i=0; i<M; ++i) {
String input = board[i];
for(int j=0; j<N; ++j) {
Map[i][j] = input.substring(j, j+1);
}
}
while (true) {
LinkedList<Position_17679> removeInfo = new LinkedList<>(); // 지울 캐릭터들의 정보
for(int i=0; i<M-DivideSize+1; ++i) {
for(int j=0; j<N-DivideSize+1; ++j) {
if(!Map[i][j].equals("")) {
doProcess(i, j, removeInfo);
}
}
}
if(removeInfo.isEmpty()) break;
// 지울 수 있는 목록들을 모두 지우기
for(Position_17679 list : removeInfo) {
Map[list.y][list.x] = "";
}
// 재배치
int remainCnt = reArrange();
answer = (M*N) - remainCnt;
}
return answer;
}
private static int reArrange() {
int cnt = 0;
// String[][] tmpArr = new String[M][N];
// for(int i=0; i<M; ++i) {
// for(int j=0; j<N; ++j) {
// tmpArr[i][j] = "";
// }
// }
for(int j=0; j<N; ++j) {
int idx=M-1;
for(int i=M-1; i>=0; --i) {
if(!Map[i][j].equals("")) {
//tmpArr[idx--][j] = Map[i][j];
Map[idx--][j] = Map[i][j];
Map[i][j] = "";
cnt++;
}
}
}
//Map = tmpArr;
return cnt;
}
private static void doProcess(int y, int x, LinkedList<Position_17679> removeInfo) {
String base = Map[y][x];
for(int i=0; i<DivideSize; ++i) {
for(int j=0; j<DivideSize; ++j) {
// 캐릭터가 같지 않다면 break
if(!Map[y+i][x+j].equals(base)) {
return;
}
}
}
// 모두 같다면 -> 지울 수 있음
for(int i=0; i<DivideSize; ++i) {
for(int j=0; j<DivideSize; ++j) {
removeInfo.add(new Position_17679(y+i, x+j));
}
}
}
}
'Algorithm > Problem_프로그래머스' 카테고리의 다른 글
프로그래머스([3차] n진수 게임) - Java (0) | 2020.05.18 |
---|---|
프로그래머스(캐시, 압축) - Java (1) | 2020.05.14 |
프로그래머스(실패율) - Java (0) | 2020.05.11 |
알고리즘(예상 대진표, [1차] 뉴스 클러스터링) - Java (0) | 2020.05.11 |
알고리즘(짝지어 제거하기) - Java (0) | 2020.05.06 |