Search

[1차] 프렌즈4블록

알고리즘
연습문제
플랫폼
프로그래머스
JCF
TreeSet
상태
해결
생성 일시
2024/01/19 07:08
최종 편집 일시
2024/01/22 07:47

문제 설명

해결과정

Solution.java

import java.util.*; class Solution { public int solution(int m, int n, String[] board) { // 지운 블록의 갯수 int answer = 0; // String 배열 board의 char 변수를 저장할 char 배열 char[][] blocks = boardToBlocks(board, m, n); // 지워야 하는 blocks 의 인덱스 추가하기 Set<String> set = new TreeSet<>(); set.add("Start"); while(set.size() != 0) { set.clear(); // Blocks 배열에서 지워야 하는 Block 확인 doubleSquareCheck(blocks, set, m, n); // Set에 있는 인덱스 지우기 clearBlock(blocks, set); // 비어있는 공간 채우기 fillEmptySpace(blocks, m, n); answer += set.size(); } return answer; } // 함수들 // 비어있는 공간 채우기 void fillEmptySpace (char[][] blocks, int m, int n) { StringBuilder sb = new StringBuilder(); int length = 0; // 지워진 블록 채우기 for(int j = 0; j < n; j++) { sb.setLength(0); for(int i = 0; i < m; i++) { // 빈문자열이 아닌 문자들 StringBuilder 에 집어넣기 if(blocks[i][j] != ' ') { sb.append(blocks[i][j]); } blocks[i][j] = ' '; } length = sb.length(); for(int i = m-length; i < m; i++) { blocks[i][j] = sb.charAt(0); sb.deleteCharAt(0); } } } // Set에 있는 인덱스들 지우기 void clearBlock (char[][] blocks, Set<String> set) { String[] arr = new String[2]; // 지워야 하는 인덱스 찾아서 지우기 for(String index : set) { arr = index.split(" "); // System.out.println("지워야 하는 인덱스 : " + arr[0] + ", " + arr[1]); blocks[Integer.parseInt(arr[0])][Integer.parseInt(arr[1])] = ' '; } } // Blocks 배열에서 지워야 하는 Block 확인 void doubleSquareCheck (char[][] blocks, Set<String> set, int m, int n) { // blocks 배열을 4개씩 확인 m-2 n-2 for(int i = 0; i <= m-2; i++) { for(int j = 0; j <= n-2; j++) { if(blocks[i][j] != ' ') { if(blocks[i][j] == blocks[i][j+1] && blocks[i][j] == blocks[i+1][j] && blocks[i][j] == blocks[i+1][j+1]) { set.add((i) + " " + (j)); set.add((i) + " " + (j+1)); set.add((i+1) + " " + (j)); set.add((i+1) + " " + (j+1)); } } } } } // Board(String) 배열 을 Blocks(char) 배열 로 변경 char[][] boardToBlocks(String[] board, int m, int n) { char[][] blocks = new char[m][n]; // String 배열 board의 char 변수를 blocks에 저장 for(int i = 0; i < board.length; i++) { for(int j = 0; j < board[i].length(); j++) { blocks[i][j] = board[i].charAt(j); } } return blocks; } // blocks 배열 출력 void printBlocks(char[][] blocks) { for(int i = 0; i < blocks.length; i++) { for(int j = 0; j < blocks[i].length; j++) { System.out.print(blocks[i][j] + " "); } System.out.print("\n"); } } }
Java
복사