[プログラマー]デジタルカメラ配色本


https://programmers.co.kr/learn/courses/30/lessons/1829
https://github.com/parkjbdev/AlgoStudy/tree/main/programmers/カカコンタクトレンズ

ソースコード

class Prob1829 {
  private final int m, n;
  private final int[][] picture;
  private boolean[][] isVisit;

  public Prob1829(int m, int n, int[][] picture) {
    this.m = m;
    this.n = n;
    this.picture = picture;
    isVisit = new boolean[m][n];
  }

  public int[] solve() {
    int numberOfArea = 0;
    int maxSizeOfOneArea = 0;

    for (int i = 0; i < m; i++)
      for (int j = 0; j < n; j++)
        if (picture[i][j] != 0 && !isVisit[i][j]) {
          numberOfArea++;
          int count = countArea(i, j, picture[i][j]);
          if (count > maxSizeOfOneArea)  maxSizeOfOneArea = count;
        }

    return new int[]{numberOfArea, maxSizeOfOneArea};
  }

  private boolean isRange(int m, int n) {
    return 0 <= m && m < this.m && 0 <= n && n < this.n;
  }

  private int countArea(int m, int n, int num) {
    if (!isRange(m, n))  return 0;
    if (picture[m][n] != num)  return 0;
    if (isVisit[m][n])  return 0;
    isVisit[m][n] = true;
    return 1 + countArea(m + 1, n, picture[m][n]) + countArea(m, n + 1, picture[m][n])
        + countArea(m - 1, n, picture[m][n]) + countArea(m, n - 1, picture[m][n]);
  }
}

に答える


各座標を二重forループで遍歴し、좌표에 해당하는 번호가 0이 아닌방문하지 않은 좌표であれば、その座標を含む区間にはアクセスしていないと考えられるためnumberOfArea1が増加した.そしてこのエリアの区間幅をcountAreaと求めた後、更新최대 구간넓이maxSizeOfOneArea.

区間幅の計算


DFSを用いて各領域を探索し,その領域の幅を求める.countArea(시작좌표 x, 시작좌표 y, 시작하는 칸의 번호)関数中
  • 좌표가 범위안에 들지 않는 경우
  • (좌표에 해당하는 번호) != (이전 좌표칸의 번호) 의 경우
  • 이미 방문했던 좌표일 경우
  • で0を返す必要があります.そうしないと、通常のアクセスが行われ、戻り値としてアクセス1と次の上下左右座標の値が加算されます.