[プログラマー]デジタルカメラ配色本
https://programmers.co.kr/learn/courses/30/lessons/1829
https://github.com/parkjbdev/AlgoStudy/tree/main/programmers/カカコンタクトレンズ
ソースコード
で0を返す必要があります.そうしないと、通常のアクセスが行われ、戻り値としてアクセス1と次の上下左右座標の値が加算されます.
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이 아닌
・방문하지 않은 좌표
であれば、その座標を含む区間にはアクセスしていないと考えられるためnumberOfArea
1が増加した.そしてこのエリアの区間幅をcountArea
と求めた後、更新최대 구간넓이
maxSizeOfOneArea
.
区間幅の計算
DFSを用いて各領域を探索し,その領域の幅を求める.countArea(시작좌표 x, 시작좌표 y, 시작하는 칸의 번호)
関数中
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이 아닌
・방문하지 않은 좌표
であれば、その座標を含む区間にはアクセスしていないと考えられるためnumberOfArea
1が増加した.そしてこのエリアの区間幅をcountArea
と求めた後、更新최대 구간넓이
maxSizeOfOneArea
.区間幅の計算
DFSを用いて各領域を探索し,その領域の幅を求める.
countArea(시작좌표 x, 시작좌표 y, 시작하는 칸의 번호)
関数中좌표가 범위안에 들지 않는 경우
(좌표에 해당하는 번호) != (이전 좌표칸의 번호) 의 경우
이미 방문했던 좌표일 경우
Reference
この問題について([プログラマー]デジタルカメラ配色本), 我々は、より多くの情報をここで見つけました https://velog.io/@parkjbdev/프로그래머스-카카오프렌즈-컬러링북テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol