영카이브 2023. 12. 17. 17:55

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

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

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

 

입력예시 :

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

 

나의 답변

import java.util.Scanner;

public class Main {
	int[] dx= { -1, 0, 1, 0 };
	int[] dy= { 0, 1, 0, -1 };
    public int solution(int n, int[][] arr) {
        int answer = 0;
        for(int y=0; y<n; y++) {
        	for(int x=0; x<n; x++) {
        		boolean flag=true; 
        		for( int k=0; k<4; k++) {
        			// 해당 좌표의 상하좌우 좌표값
        			int nx=dx[k]+x; 
        			int ny=dy[k]+y;
        			// 봉우리가 아닌 것 먼저 구하기
        			// ArrayIndexOutOfBoundaryError를 방지 하기위해 nx>=0 && nx<n && ny>=0 && ny<n 먼저 설젇
        			if( nx>=0 && nx<n && ny>=0 && ny<n && arr[ny][nx]>=arr[y][x]) {
        				flag=false;
        				break; 
        			}
        		}
        		if(flag) answer++; 
        	}
        }
        return answer;
    }

    public static void main(String[] args) {
        Main T = new Main();
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[][] arr = new int[n][n];
        for (int y = 0; y < n; y++) {
            for (int x = 0; x < n; x++) {
                arr[y][x] = sc.nextInt();
            }
        }
        System.out.println(T.solution(n, arr));
    }
}

 

상하좌우 배열을 전역변수로 두고 쓰면 좋은 이유는?

  1. 단순성 및 가독성: 코드가 간결하며, 주어진 문제에 대한 해결 방법이 명확합니다.
  2. 모듈화: 상하좌우 이동 방향이 배열로 정의되어 있어 코드의 확장성이 좋습니다.
  3. 코드 재사용: 상하좌우 이동 방향 배열을 재사용하여 코드를 간소화할 수 있습니다.