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

lhs's avatar
Dec 13, 2024
[프로그래머스] [1차] 프렌즈4블록(17679)
 

1. 문제 풀이 아이디어

  • 게임의 진행 과정을 그대로 구현하여 문제를 해결할 수 있다.

2. 나의 정답 코드

import java.util.ArrayDeque; import java.util.Queue; class Solution { public int solution(int m, int n, String[] board) { int answer = 0; char[][] map = new char[m][n]; int[][] box = {{0, 0}, {0, 1}, {1, 0}, {1, 1}}; for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { map[i][j] = board[i].charAt(j); } } while (true) { Queue<int[]> queue = new ArrayDeque<>(); for (int i = 0; i < m - 1; i++) { for (int j = 0; j < n - 1; j++) { char cur = map[i][j]; if (cur == ' ') continue; if (map[i + 1][j] != cur || map[i][j + 1] != cur || map[i + 1][j + 1] != cur) continue; queue.add(new int[]{i, j}); } } if (queue.isEmpty()) break; while (!queue.isEmpty()) { int[] cur = queue.poll(); for (int i = 0; i < 4; i++) { int curx = cur[0] + box[i][0]; int cury = cur[1] + box[i][1]; if (map[curx][cury] == ' ') continue; map[curx][cury] = ' '; answer++; } } for (int i = m - 1; i >= 0; i--) { for (int j = 0; j < n; j++) { if (map[i][j] != ' ') continue; int k = i - 1; while (k >= 0 && map[k][j] == ' ') k--; if (k < 0) continue; map[i][j] = map[k][j]; map[k][j] = ' '; } } } return answer; } }

3. 정리

  • 입력 데이터를 2차원 문자 배열로 변환한다.
  • 배열을 순회하며 지워야 할 블록의 좌상단 좌표를 큐에 저장한다.
  • 큐에서 좌표를 하나씩 꺼내 해당 블록을 빈 문자로 바꾸고, 결과값을 증가시킨다.
  • 문자 배열에서 빈 문자가 있을 경우 위에서 문자를 찾아 채운다.
  • 지워야 할 블록이 없으면 반복문을 종료하고 결과값을 반환한다.
Share article

LHS's Study Space