본문 바로가기
Java/Coding-Test

[Java] 2-10 봉우리

by JS1111 2022. 1. 18.

문제

지도 정보가 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

댓글