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

하우르·2021년 7월 2일
0

https://programmers.co.kr/learn/courses/30/lessons/17679[링크텍스트](https://programmers.co.kr/learn/courses/30/lessons/17679)

풀이

  1. 삭제할 블록을 모두 찾는다.
  2. 그 블롣들을 삭제한다.
  3. 블록을 떨어트린다.

처음에 1단계에서 삭제할 블록을 찾는건 쉬웠지만
그 정보를 저장으==할 방법때문에 오래걸렸다.
bool[][] 로 저장하니까 나머지도 쉽게 찾았다.

class Solution {
    	final static int[][] dx = { { 0, 1, 1 }, { -1, -1, 0 }, { -1, -1, 0 }, { 0, 1, 1 } };
	final static int[][] dy = { { 1, 0, 1 }, { 0, 1, 1 }, { 0, -1, -1 }, { -1, -1, 0 } };
	static int delete(int n, int m) {
		int delete_num = 0;
		for (int i = 0; i < m; i++) {
			for (int j = 0; j < n; j++) {
				if(map[i][j]!='-')
				{
					for (int k = 0; k < 4; k++) {
						int ok=0;
						for (int o = 0; o < 3; o++) {
							int x = i + dx[k][o];
							int y = j + dy[k][o];
							if(x>=m || y>=n || x<0 || y<0) continue;
							if(map[i][j]==map[x][y])
								ok++;
						}
						if(ok==3)
						{
							delete_num++;
							check[i][j] = true;
							break;
						}
					}
				}
			}
		}
		return delete_num;
	}

	static void drop( int n, int m) {
		while(true)
		{
			int num=0;
			for (int i = 0; i < m; i++) {
				for (int j = 0; j < n; j++) {
					if(map[i][j]=='-')
					{
						if(i-1<0)
							map[i][j]='-';
						else if(map[i-1][j]!='-'){
							num++;
							map[i][j]=map[i-1][j];
							map[i-1][j]='-';
						}
					}
				}
			}
			if(num==0)
				break;
		}

	}

	static boolean[][] check;
	static char[][] map;
    
    public int solution(int m, int n, String[] board) {
        map = new char[m][n];
		for (int i = 0; i < m; i++) {
			for (int j = 0; j < n; j++) {
				map[i][j] = board[i].charAt(j);
			}
		}

		int ans=0;
		while(true) {
			check = new boolean[m][n];
			int temp = delete(n,m);
			if(temp==0)
				break;
			ans+=temp;
            for (int i = 0; i < m; i++) {
				for (int j = 0; j < n; j++) {
					if(check[i][j]==true)
						map[i][j]='-';
				}
			}
			drop(n,m);

		}
        return ans;
    }
}
profile
주니어 개발자

0개의 댓글

관련 채용 정보