[프로그래머스] 프렌즈4블록 (JAVA)

유존돌돌이·2021년 10월 27일
0

Programmers

목록 보기
89/167
post-thumbnail

문제 설명

블라인드 공채를 통과한 신입 사원 라이언은 신규 게임 개발 업무를 맡게 되었다. 이번에 출시할 게임 제목은 "프렌즈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로 다 올려버렸다.

0개의 댓글