import java.util.*;
class Main {
public int solution(int n,int[][] arr) {
int answer = 0;
//격자판 생성
n = n+2;
int[][] mt = new int[n][n];
for(int i=0; i<n-2; i++) {
for(int j=0; j<n-2; j++) {
mt[i+1][j+1] = arr[i][j];
}
}
//탐색
for(int i=1; i<n-1; i++) {
for(int j=1; j<n-1; j++) {
int tmp = mt[i][j];
//상,하
if(tmp > mt[i+1][j] && tmp > mt[i-1][j]) {
//좌,우
if(tmp > mt[i][j+1] && tmp > mt[i][j-1]) {
answer ++;
}
}
}
}
return answer;
}
public static void main(String[] args) {
Main T = new Main();
Scanner kb = new Scanner(System.in);
int n = kb.nextInt();
int[][] arr = new int[n][n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
arr[i][j] = kb.nextInt();
}
}
System.out.println(T.solution(n, arr));
}
}
++ 위치값을 설정해서 푸는방법!
import java.util.*;
class Main {
int[] dx = {-1,0,1,0};
int[] dy = {0,1,0,-1};
public int solution(int n,int[][] arr) {
int answer = 0;
for(int i=0; i<n; i++) {
for (int j=0; j<arr.length; j++) {
boolean flag = true;
for(int k=0; k<4;k++) {
int nx = i+dx[k];
int ny = j+dy[k];
//4방향중 크거나 같은것이 있다면 false
if(nx>=0 && nx<n && ny>=0 && ny<n && arr[nx][ny] >= arr[i][j]) {
flag = false;
break;
}
}
if(flag) answer++;
}
}
return answer;
}
public static void main(String[] args) {
Main T = new Main();
Scanner kb = new Scanner(System.in);
int n = kb.nextInt();
int[][] arr = new int[n][n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
arr[i][j] = kb.nextInt();
}
}
System.out.println(T.solution(n, arr));
}
}
만약 현재 값이 arr[1][1] 이고
nx = i+dx[k]와 ny = j+dy[k]를 대입해
for(int k=0; k<4; k++)문이 돌게된다면
1. arr[0][1](상)
2.arr[1][2](우)
3.arr[2][1](하)
4.arr[1][0](좌) 값을 시계방향으로 탐색하게 된다.
4개의 값중 현재선택된 값(arr[i][j])보다 크거나 같은 값이 있다면 봉우리가 아니다.
이때, 그냥 탐색하게 되면 arr[-1][0]과 같은 배열 값을 벗어나버리는 indexOutOfBound가 발생할 수 있으므로 예외처리를 꼭 먼저 해줘야한다!
상,하,좌,우 뿐만이 아니라 대각선의 값까지 고려해야하는 문제가 있을수 있으므로, 위치값으로 문제를 해결하는 법을 더 공부하자!