봉우리

최준호·2021년 8월 9일
0

알고리즘 강의

목록 보기
17/79

설명

지도 정보가 N*N 격자판에 주어집니다. 각 격자에는 그 지역의 높이가 쓰여있습니다.

각 격자판의 숫자 중 자신의 상하좌우 숫자보다 큰 숫자는 봉우리 지역입니다. 봉우리 지역이 몇 개 있는 지 알아내는 프로그램을 작성하세요.

격자의 가장자리는 0으로 초기화 되었다고 가정한다.

만약 N=5 이고, 격자판의 숫자가 다음과 같다면 봉우리의 개수는 10개입니다.

코드

public class Peaks {
    public static void main(String[] args){
        Scanner in=new Scanner(System.in);
        int input1 = in.nextInt();
        int[][] arr = new int[input1][input1];
        for(int i=0; i<input1; i++){
            for(int j= 0; j<input1; j++){
                arr[i][j] = in.nextInt();
            }
        }

        solution2(arr);
    }

    public static void solution(int[][] arr){
        int length = arr.length;
        int count = 0;
        for(int i=0; i<length; i++){
            for(int j=0; j<length; j++){
                int p = arr[i][j];  //기준이 되는 수
                boolean flag = true;
                //상
                if(i>0){
                    if(arr[i-1][j]<p) flag = true;
                    else continue;
                }
                //하
                if(i<length-1 && flag){
                    if(arr[i+1][j]<p) flag = true;
                    else continue;
                }
                //좌
                if(j>0 && flag){
                    if(arr[i][j-1]<p) flag = true;
                    else continue;
                }
                //우
                if(j<length-1 && flag){
                    if(arr[i][j+1]<p) flag = true;
                    else continue;
                }

                if(flag) count++;
            }
        }
        System.out.println(count);
    }

    public static void solution2(int[][] arr){
        int length = arr.length;
        int count = 0;
        int[] x = {-1,1,0,0};
        int[] y = {0,0,-1,1};
        for(int i=0; i<length; i++){
            for(int j=0; j<length; j++){
                int p = arr[i][j];  //기준이 되는 수
                boolean flag = true;
                for(int h=0; h<x.length; h++){
                    int xd = i+x[h];
                    int yd = j+y[h];
                    if(xd>=0 && yd>=0 && xd<length && yd<length){
                        if(arr[xd][yd]>=p){
                            flag = false;
                            break;
                        }
                    }
                }
                if(flag)count++;
            }
        }
        System.out.println(count);
    }
}

2차원 배열을 놓고 기준이 되는 값을 정한 뒤 비교하여 탐색하는 문제였다.

처음에는 문제에서 제시한 조건을 그대로 따라 적어 코드화시켜 만든 코드였다. 그래서 첫번째 코드를 먼저 보면 로직을 이해하기는 더 쉬울것 같다.

그리고 강의를 들었을 때 강사님이 풀이한 코드를 참고하여 수정한 코드가 두번째 코드인데 상하좌우를 배열에 넣어 for문으로 간략하게 변경하였고 마지막 조건은 위의 조건 if문에 모두 포함시켜도 되지만 가독성이 더 좋게 보이기 위해서 아래로 빼서 작성하였다.

어려워 보였지만 막상 풀면 쉬운 문제

0개의 댓글

관련 채용 정보