[프로그래머스] 프렌즈4블록 (JAVA)
문제 설명
블라인드 공채를 통과한 신입 사원 라이언은 신규 게임 개발 업무를 맡게 되었다. 이번에 출시할 게임 제목은 "프렌즈4블록".
같은 모양의 카카오프렌즈 블록이 2×2 형태로 4개가 붙어있을 경우 사라지면서 점수를 얻는 게임이다.위 초기 배치를 문자로 표시하면 아래와 같다.
TTTANT
RRFACC
RRRFCC
TRRRAA
TTMMMF
TMMTTJ
각 문자는 라이언(R), 무지(M), 어피치(A), 프로도(F), 네오(N), 튜브(T), 제이지(J), 콘(C)을 의미한다입력으로 블록의 첫 배치가 주어졌을 때, 지워지는 블록은 모두 몇 개인지 판단하는 프로그램을 제작하라.
Code
import java.util.*;
class Solution {
public int solution(int m, int n, String[] board) {
String[][] map = new String[m][n];
for(int i=0 ; i<m ; i++) {
map[i] = board[i].split("");
}
int countX = 0;
while(true) {
String[][] next = new String[m][n];
// 임시 Array 만들기
for(int i=0 ; i<m ; i++) {
next[i] = Arrays.copyOf(map[i], n);
}
Set<String> hs = new HashSet<>();
// 사각형 터뜨리기
for(int i=0 ; i<m-1 ; i++) {
for(int j=0 ; j<n-1 ; j++) {
helper(i, j, next, map, hs);
}
}
// 터뜨린 케이스가 없다면 break;
if(hs.isEmpty()) {
break;
}
countX += hs.size();
// X올리기
for(int j=0 ; j<n ; j++) {
swapper(j, next);
}
map = next;
}
return countX;
}
public void swapper(int j, String[][] map) {
int ic = map.length-1, ix = map.length-1;
while(ic>=0 && ix>=0) {
while(ic>=0 && map[ic][j].equals("X")) {
ic--;
}
while(ix>ic && ix>=0 && !map[ix][j].equals("X")) {
ix--;
}
if(ic>=0 && ix>ic) {
map[ix][j] = map[ic][j];
map[ic][j] = "X";
}
ix--;
ic--;
}
}
public void helper(int i, int j, String[][] next, String[][] map, Set<String> hs) {
//System.out.println("i : "+i+" / j : "+j);
if(map[i][j].equals("X") || map[i+1][j].equals("X") || map[i][j+1].equals("X") || map[i+1][j+1].equals("X")) return;
if(map[i][j].equals(map[i+1][j]) && map[i][j].equals(map[i][j+1]) && map[i][j].equals(map[i+1][j+1])) {
next[i][j] = "X";
next[i+1][j] = "X";
next[i][j+1] = "X";
next[i+1][j+1] = "X";
hs.add(i+"|"+j);
hs.add((i+1)+"|"+j);
hs.add(i+"|"+(j+1));
hs.add((i+1)+"|"+(j+1));
}
return;
}
}
Comment
1트 : List<List> 으로 원래는 map을 만들고, 터지면서 줄어드는 것을 list.remove로 지워가려 했지만, column 길이가 달라졌을때 예외처리하는게 귀찮았다.
2트 : 이번에는 String[][] 으로 map을 만들고 터지면 "X"로 치환만 하고 그대로 두고 사각형을 만들때 X가 안나올때까지 위로 올렸는데, 그렇게 하면
C A B
C A B
C C A
C C A
위와 같은 상황에서 C가 터지면서 A가 내려오면서 A가 터져야하는데 이런 케이스를 잡지 못했다. 물론 index를 왔다갔다하면 되겠지만, 효율적이 않겠다고 생각.
3트 : X치환하고 X를 swapper로 다 올려버렸다.
Author And Source
이 문제에 관하여([프로그래머스] 프렌즈4블록 (JAVA)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@ujone/프로그래머스-프렌즈4블록-JAVA저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)