봉우리

최준호·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문에 모두 포함시켜도 되지만 가독성이 더 좋게 보이기 위해서 아래로 빼서 작성하였다.

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

profile
코딩을 깔끔하게 하고 싶어하는 초보 개발자 (편하게 글을 쓰기위해 반말체를 사용하고 있습니다! 양해 부탁드려요!) 현재 KakaoVX 근무중입니다!

0개의 댓글