-
[프로그래머스] 프렌즈 4블록 (2018 KAKAO BLIND RECRUITMENT)ALGORITHM/PROGRAMMERS 2021. 1. 5. 11:06
programmers.co.kr/learn/courses/30/lessons/17679
2021-01-05
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107public class Solution17679 {public static int N, M, answer;public static int dx[] = {0, 1, 1};public static int dy[] = {1, 0, 1};public static char arr[][];public static int map[][];public static boolean flag;public static void down() {for(int j = 0; j < M; j++) {loop:for(int i = N-1; i > 0; i--) {if(arr[i][j] == ' ') {for(int k = i-1; k >= 0; k--) {if(arr[k][j] != ' ') {arr[i][j] = arr[k][j];arr[k][j] = ' ';i--;}}break loop;}}}}public static void bomb() {for(int i = 0; i < N; i++) {for(int j = 0; j < M; j++) {if(map[i][j] > 0) {answer++;arr[i][j] = ' ';}}}}public static void solve(int x, int y, int num) {int count = 0;for(int i = 0; i < 3; i++) {int nx = x + dx[i];int ny = y + dy[i];if(nx < 0 || ny < 0 || nx >= N || ny >= M) continue;if(arr[nx][ny] == arr[x][y]) {count++;}}if(count == 3) {map[x][y] = num;for(int i = 0; i < 3; i++) {int nx = x + dx[i];int ny = y + dy[i];map[nx][ny] = num;}flag = true;}}public static void init() {for(int i = 0; i < N; i++)for(int j = 0; j < M; j++)map[i][j] = 0;}public static int solution(int m, int n, String[] board) {answer = 0;N = m;M = n;arr = new char[N][M];map = new int[N][M];for(int i = 0; i < N; i++) {for(int j = 0; j < M; j++) {arr[i][j] = board[i].charAt(j);}}while(true) {flag = false;int num = 1;init();for(int i = 0; i < N; i++) {for(int j = 0; j < M; j++) {if(arr[i][j] != ' ') {solve(i, j, num++);}}}if(!flag) break;else {bomb();down();}}return answer;}public static void main(String[] args) {String[] bo = {"TTTANT", "RRFACC", "RRRFCC", "TRRRAA", "TTMMMF", "TMMTTJ"};System.out.println(solution(6, 6, bo));}}cs #문제풀이
1. String 1차원 배열의 입력값을 char 형태의 2차원 배열로 정리했다.
2. 먼저 하나의 기준점을 잡고 오른쪽, 오른쪽 대각선 아래, 아래를 체크한다. 3개 모두 기준점의 값과 같으면 2x2 블록이므로 제거하기 위해 map 배열에 번호를 체크를 한다.
3. 판 하나를 다 돌고나서, 2x2 블럭이 하나라도 있었으면 기존 판에서 map으로 체크된 부분을 다 ' ' 상태로 바꾼다.
4. 모두 터뜨리고 나서는 빈 공간을 채워야하므로 위에 있는 값들을 내려서 아래 빈 공간을 채운다.
5. 2~4번을 2x2 블럭이 더 이상 없을 때까지 반복한다.'ALGORITHM > PROGRAMMERS' 카테고리의 다른 글
[프로그래머스] 보석 쇼핑 (2020 카카오 인턴십) (0) 2021.01.06 [프로그래머스] 캐시 (2018 KAKAO BLIND RECRUITMENT) (0) 2021.01.05 [프로그래머스] 뉴스 클러스터링 (2018 KAKAO BLIND RECRUITMENT) (0) 2021.01.02 [프로그래머스] 비밀지도 (2018 KAKAO BLIND RECRUITMENT) (0) 2020.12.28 [프로그래머스] 셔틀버스 (2018 KAKAO BLIND RECRUITMENT) (0) 2020.12.18