문제
지도 정보가 N*N 격자판에 주어집니다. 각 격자에는 그 지역의 높이가 쓰여있습니다.
각 격자판의 숫자 중 자신의 상하좌우 숫자보다 큰 숫자는 봉우리 지역입니다.
봉우리 지역이 몇 개 있는 지 알아내는 프로그램을 작성하세요.
격자의 가장자리는 0으로 초기화 되었다고 가정한다.
만약 N=5 이고, 격자판의 숫자가 다음과 같다면 봉우리의 개수는 10개입니다.
입력
첫 줄에 자연수 N이 주어진다.(2<=N<=50)
두 번째 줄부터 N줄에 걸쳐 각 줄에 N개의 자연수가 주어진다. 각 자연수는 100을 넘지 않는다.
출력
봉우리의 개수를 출력하세요.
예시 입력
5
5 3 7 2 3
3 7 1 6 1
7 2 5 3 4
4 3 6 4 1
8 7 3 5 2
예시 출력
10
내 풀이
private static int countPeaks(int num, int[][] inputs) {
int count = 0;
for (int i = 0; i < num; i++)
for (int j = 0; j < num; j++)
if (isPeak(i, j, inputs)) count++;
return count;
}
private static enum Direction {
UP, RIGHT, DOWN, LEFT,
}
// inputs[row][col]이 봉우리인지 확인
private static boolean isPeak(int row, int col, int[][] inputs) {
// 상하좌우 반복
for (Direction direction : Direction.values()) {
int row2 = row; // 비교할 위치의 행
int col2 = col; // 비교할 위치의 열
switch (direction) {
case UP:
row2--; break;
case RIGHT:
col2++; break;
case DOWN:
row2++; break;
case LEFT:
col2--; break;
}
// 가장자리를 만나면 다음방향으로 넘어간다
if (row2 < 0 || row2 >= inputs.length ||
col2 < 0 || col2 >= inputs.length) continue;
// 자신보다 큰 방향이 있다면 바로 false 반환
if (inputs[row][col] <= inputs[row2][col2]) {
return false;
}
}
return true;
}
다른 풀이
/* 강의 풀이 */
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;
}
'Java > Coding-Test' 카테고리의 다른 글
[Java] 2-12 멘토링 (0) | 2022.01.18 |
---|---|
[Java] 2-11 임시반장 정하기 (0) | 2022.01.18 |
[Java] 2-9 격자판 최대합 (0) | 2022.01.18 |
[Java] 2-5 소수(에라토스테네스 체) (0) | 2022.01.18 |
[Java] 2-4 피보나치 수열 (0) | 2022.01.17 |
댓글