프로그래머스 | 프렌즈4블록 (Java)

mul·2023년 3월 17일
0

알고리즘

목록 보기
40/65
post-custom-banner

🔒 문제

프로그래머스 Lv.2 2018 KAKAO BLIND RECRUITMENT [1차] 프렌즈4블록

🔑 해결

입력으로 블록의 첫 배치가 주어졌을 때, 지워지는 블록의 개수를 return하는 solution함수를 작성하는 문제이다. 블록은 2x2형태로 4개가 붙어있을 경우 지워진다.

  1. 지워질 블록 찾기
  2. 블록 지우기
    를 순서대로 구현하면 풀리는 문제이다.

🔓 코드

import java.util.ArrayList;
class Solution {
    public int solution(int m, int n, String[] board) {
        int answer = 0;
        
        char[][] cboard = new char[m][n];
		for (int i = 0; i < m; i++) {
			for (int j = 0; j < n; j++) {
				cboard[i][j] = board[i].charAt(j);
			}
		}
		
		boolean[][] bboard = new boolean[m][n];
		boolean deleted = true;
		
        while(deleted) { // 지워질 블록이 없을 때까지 반복
        	// 블록 찾기 전 bboard를 false로 초기화
        	for (int i = 0; i < m; i++) {
				for (int j = 0; j < n; j++) {
					bboard[i][j] = false;
				}
			}
        	
        	// 지워질 블록 찾기
        	for (int i = 0; i < m-1; i++) {
				for (int j = 0; j < n-1; j++) {
					char target = cboard[i][j];
					if (target != '0'
							&& target == cboard[i][j+1] && target == cboard[i+1][j+1] && target == cboard[i+1][j]) {
						bboard[i][j] = true;
						bboard[i][j+1] = true;
						bboard[i+1][j+1] = true;
						bboard[i+1][j] = true;
					}
				}
			}
        	
        	// 지워진 블록이 없으면(=모든 블록이 false면) while문을 끝냄
        	deleted = false;
        	for (int i = 0; i < m; i++) {
				for (int j = 0; j < n; j++) {
					if (bboard[i][j]) {
						answer++;
						deleted = true;
					}
				}
			}
        	
        	// 블록 지우기
        	for (int i = 0; i < n; i++) {
				ArrayList<Character> list = new ArrayList<Character>();
        		for (int j = m - 1; j >= 0; j--) {
        			if(!bboard[j][i]) { // bboard[j][i]가 false이면 list에 add
        				list.add(cboard[j][i]);
        			}
        			cboard[j][i] = '0';
				}

        		int len = list.size();
        		for (int j = m - 1, k = 0; j >= m - len && k < len; j--, k++) {
        			cboard[j][i] = list.get(k); // list에 저장된 값 꺼내서 cboard에 저장
        		}
			}
        	
        }
        
        return answer;
    }
}
post-custom-banner

0개의 댓글