유블로그

[프로그래머스] 프렌즈4블록 Java 본문

알고리즘

[프로그래머스] 프렌즈4블록 Java

yujeong kang 2021. 1. 29. 20:44

[프로그래머스] level2 프렌즈4블록

 

소요시간 : 38분

 

문제가 하라는 대로 했다.

 

지워지는 블록이 0개가 될 때까지 while 문에서 반복한다.

remove()

: i , j 가 있다면

(i+1, j), (i, j+1), (i+1, j+1) 세 개가 일치하는 지 확인 후 일치한다면 list에 위치를 넣어놓는다.

list에 있는 위치들을 지워진 블록('-')으로 표시한다. 이 때 중복은 개수를 세지 않는다.

 

move()

: 블록을 지웠으니 아래로 블록을 떨어뜨려야 한다.

가로 맨 밑부터 위로 올라가면서 지워진 블록 개수를 세고

그 수만큼 위에서 아래로 땡긴다.

블록이 없는 칸은 '*' 으로 표시하여 접근하지 않도록 한다.

 

답이 다르게 나와서 디버깅하면서 고쳤다... 시간이 꽤 걸렸다..ㅎ

import java.util.ArrayList;
import java.util.List;

class Solution {
	char[][] map;
    public int solution(int m, int n, String[] board) {
        int answer = 0;
        
        M = m;
        N = n;
        map = new char[m][];
        for (int i = 0; i < board.length; i++) {
			map[i] = board[i].toCharArray();
		}
        
        while(true) {
        	int cnt = remove();
        	if(cnt == 0) return answer;
        	answer += cnt;
        	move();
        }
        
    }
    
    int M,N;
    List<int[]> pos;
    int remove() {
    	pos = new ArrayList<>();
    	for (int i = 0; i < M-1; i++) {
			for (int j = 0; j < N-1; j++) {
				if(map[i][j] == '*') continue;
				if(map[i][j] == map[i+1][j] && map[i][j] == map[i+1][j+1] && map[i][j] == map[i][j+1]) {
					pos.add(new int[] {i,j});
					pos.add(new int[] {i+1,j});
					pos.add(new int[] {i,j+1});
					pos.add(new int[] {i+1,j+1});
				}
			}
		}
    	
    	int cnt = 0;
    	for (int[] p : pos) {
    		if(map[p[0]][p[1]] == '-') continue;
			map[p[0]][p[1]] = '-';
    		cnt++;
    	}
    	
    	return cnt;
    }
    
    void move() {
    	for (int j = 0; j < N; j++) {
    		for (int i = M-1; i >= 0; i--) {
    			if(map[i][j] != '-') continue;
    			int cnt = 0;
    			if(map[i][j] == '-') {
    				cnt++;
    				int idx = i-1;
    				while(true) {
    					if(idx < 0) break;
    					if(map[idx--][j] != '-') break;
    					cnt++;
    				}
    				idx = i;
					while(true) {
						if(idx-cnt < 0) {
							while(idx >= 0) {
								map[idx--][j] = '*';
							}
							break;
						}
						map[idx][j] = map[idx-cnt][j];
						idx--;
					}
    			}
			}
		}
    } // move
}