코드
import java.util.*;
import java.util.stream.IntStream;
/*
핵심
별도 탐색 배열을 만드는 것
탐색 배열을 이용해 반복문으로 인덱스 보정
보정 값에 조건문
탐색 배열의 이점, 조건문 4번으로 검사해도 되지만,
만약 좌상,상, 우상, 이렇게 8방향을 검사하라고 하면?
*/
class 봉우리 {
public static void main(String[] args){
//봉우리 크기
final int LENGTH = 10;
//봉우리 높이
final int HEIGTH = 10;
int answer=0;
int[][] arr = IntStream.range(0, LENGTH)
.mapToObj(num->{
return new Random().ints(LENGTH, 0, HEIGTH)
.toArray();
}).toArray(int[][]::new);
prettyPrint(arr);
// 타겟[i][j] 위치에 상 우 하 좌 위치 탐색 배열
int[] dx={-1, 0, 1, 0};
int[] dy={0, 1, 0, -1};
for(int i=0; i<LENGTH; i++){
for(int j=0; j<LENGTH; j++){
boolean flag=true;
//탐색을 위한 반복문 순회
for(int k=0; k<4; k++){
//인덱스 보정 상, 우, 하, 좌
int ni=i+dx[k];
int nj=j+dy[k];
// 보정인덱스는 -1이나 배열크기면 크다고 가정한다.
// 예를들어 [0,0] [마지막][마지막] 배열을 보정하면 배열범위를 초과해 익셉션 발생
if(0<=ni && ni<LENGTH && 0 <= nj && nj<LENGTH && arr[i][j]<=arr[ni][nj] ){
flag=false;
//한 개라도 작거나 같으면 break
break;
}
}
if(flag) {
System.out.print("["+i+","+j+"] "+arr[i][j]+(answer%5==4?"\n":""));
answer++;
}
}
}
System.out.println();
System.out.println(answer);
}
static void prettyPrint(int[][] arr, boolean isIndex) {
for(int i=0;i<arr.length;i++) {
for(int j=0;j<arr[i].length;j++) {
if(isIndex) System.out.printf("%2d,%2d ", i,j);
else System.out.printf("%2d" + (j==arr[i].length-1? "":",") ,arr[i][j]);
}
System.out.println(isIndex?"\n":"");
}
}
static void prettyPrint(int[][] arr) {
prettyPrint(arr, false);
}
}
결과
5, 4, 4, 1, 5, 6, 3, 5, 0, 3
7, 4, 8, 7, 7, 7, 1, 4, 4, 9
9, 3, 7, 3, 9, 2, 6, 2, 0, 2
7, 1, 2, 6, 0, 2, 0, 5, 9, 9
3, 0, 1, 3, 9, 1, 5, 3, 1, 9
2, 8, 2, 2, 0, 6, 0, 4, 9, 3
1, 3, 6, 8, 6, 8, 6, 4, 8, 0
0, 6, 3, 6, 2, 3, 2, 2, 6, 7
1, 5, 4, 4, 5, 7, 6, 4, 7, 2
9, 4, 7, 3, 2, 2, 5, 8, 7, 9
[0,7] 5[1,2] 8[1,9] 9[2,0] 9[2,4] 9
[2,6] 6[3,3] 6[4,4] 9[4,6] 5[5,1] 8
[5,8] 9[6,3] 8[6,5] 8[7,1] 6[7,9] 7
[8,5] 7[9,0] 9[9,2] 7[9,7] 8[9,9] 9
20
핵심 구조는 2차원 배열을 순회하는 이중 반복문을 사용하는데 이정된 인덱스[][] 마다 내 상, 하, 좌, 우를 검증하는 반복문을 넣는 것이다.
위 예제를 단순히 삼중 반복문 사용하네!! 이렇게 접근하면 복잡하고 어려워진다.
이차원 배열을 순회하는 이중 반복문 + 지정된 배열[][] 마다 검증로직(반복문)
이렇게 접근해야 쉬워진다.