Post

백준_11559 (Puyo Puyo)

구현방법

  1. dfs를 이용하여 같은 색의 인접뿌요를 탐색
  2. 같은 색의 인접뿌요가 4개 이상 터질 시 (puyoCnt가 4 이상이 됐을 때) 해당 뿌요그룹을 터뜨림
  3. 터짐이 발생했을 경우 중력에 의해 뿌요들이 밑으로 내려가야하므로 공중에 떠 있는 뿌요들을 최대한 밑으로 내림 (가장 밑 뿌요 바로 전 까지 or 뿌요가 없을 경우 바닥 끝까지)

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
package com.company.baekjoon._11559;

import java.io.*;

public class 한규호_11559 {

  static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

  static int[] dx = {-1, 0, 1, 0};
  static int[] dy = {0, 1, 0, -1};
  static int row = 12;
  static int col = 6;
  static char[][] field = new char[row][col]; // 뿌요 필드
  static int[][] visit = new int[row][col]; // 뿌요 방문 맵
  static int puyoCnt = 0; // 인접 뿌요 수
  static int result = 0; // 최종 결과
  static boolean isExplode = false; // 뿌요 터짐 발생유무

  public static void main(String[] args) throws IOException {
    for (int i = 0; i < row; i++) {
      String line = br.readLine();
      for (int j = 0; j < col; j++) {
        field[i][j] = line.charAt(j);
      }
    }
    while (true) {
      for (int i = 0; i < row; i++) {
        for (int j = 0; j < col; j++) {
          if (visit[i][j] == 0 && field[i][j] != '.') {
            char item = field[i][j];
            dfs(i, j, item);
            if (puyoCnt >= 4) { // 인접 뿌요가 4개 이상 잡히면 뿌요 터짐 발생 -> 점으로 치환
              explode();
              bw.write("\n---visit(explode) map---\n");
              print2ndArr(visit);
              bw.write("\n---explode---\n");
              print2ndArr(field);
              isExplode = true;
            }
          }
          visit = new int[row][col];
          puyoCnt = 0;
        }
      }

      if (isExplode) { // 뿌요 터짐 발생 시 공중에 떠있는 뿌요들을 밑으로 내려주고 연쇄카운트 증가
        toGround();
        bw.write("\n---toGround---\n");
        print2ndArr(field);
        result++;
        isExplode = false;
      } else {
        break;
      }
    }

    bw.write(Integer.toString(result));
    bw.close();
    br.close();
  }

  public static void toGround() {
    for (int y = 0; y < col; y++) {
      char[] verticalLine = new char[row];
      int idx = 0;
      for (int x = row - 1; x >= 0; x--) {
        if (field[x][y] != '.') {
          verticalLine[idx++] = field[x][y];
        }
      }
      for (int x = idx; x < row; x++) {
        verticalLine[x] = '.';
      }
      idx = 0;
      for (int x = row - 1; x >= 0; x--) {
        field[x][y] = verticalLine[idx++];
      }
    }
  }

  public static void explode() {
    for (int x = 0; x < row; x++) {
      for (int y = 0; y < col; y++) {
        if (visit[x][y] == 1) {
          field[x][y] = '.';
        }
      }
    }
  }

  public static void dfs(int x, int y, char item) {
    visit[x][y] = 1;
    puyoCnt++;
    for (int i = 0; i < 4; i++) {
      int nx = x + dx[i];
      int ny = y + dy[i];
      if (ny >= 0 && ny < col && nx >= 0 && nx < row) {
        if (field[nx][ny] == item && visit[nx][ny] == 0) {
          dfs(nx, ny, item);
        }
      }
    }
  }

  public static void print2ndArr(char[][] arr) throws IOException {
    int row = arr.length;
    int col = arr[0].length;
    for (int i = 0; i < row; i++) {
      for (int j = 0; j < col; j++) {
        bw.write(arr[i][j]);
      }
      bw.write("\n");
    }
    bw.write("\n");
  }

  public static void print2ndArr(int[][] arr) throws IOException {
    int row = arr.length;
    int col = arr[0].length;
    for (int i = 0; i < row; i++) {
      for (int j = 0; j < col; j++) {
        bw.write(Integer.toString(arr[i][j]));
      }
      bw.write("\n");
    }
    bw.write("\n");
  }
}


문제 링크

This post is licensed under CC BY 4.0 by the author.