public class C22 {
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<n; j++) {
boolean flag = true;
for(int k = 0; k<4; k++) {
int nx = i+dx[k];
int ny = j+dy[k];
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) {
C22 c = new C22();
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[][] arr = new int[n][n];
for(int i = 0; i < n; i++) {
for(int j = 0; j<n; j++) {
arr[i][j] = sc.nextInt();
}
}
System.out.println(c.solution(n, arr));
sc.close();
}
}
풀이
1. 2차원 배열을 입력받고
2. 전역변수로 dx dy로 좌표의 움직임을 정의하는 부분을 선언 (ex) 0,0에서 오른쪽 좌표를 보려면 x좌표+0(dx), y좌표+1(dy) )
3. 하나의 좌표를 정하고(2중 for문을 통해) boolean을 선언하고 그 안에 다시 for문을 통해 좌표를 돌아가면서 자기 좌표보다 크다면 false로 바꿔준다.
4. true인 좌표는 봉우리임에 틀림없다. 개수를 센다
5. 경계선 처리는
if(nx>=0 && nx<n && ny>=0 && ny<n && arr[nx][ny]>=arr[i][j])
이 부분을 통해 처리한다.
특히
nx>=0 && nx<n && ny>=0 && ny<n
이 조건이 뒤에 오면 인덱스를 벗어낫다는 에러가 뜬다.
앞 쪽에 와야 에러를 피할 수 있다.
nx>=0 경계선이 마이너스인 경우는 안 된다.
nx<n 경계션이 n(배열의 최대값)을 넘어가면 안된다.(0부터 시작하기에 <= X)
ny>=0, ny<n도 마찬가지.