Computer Science/Algorithm

[Inflearn] 봉우리

코딩맛 2023. 1. 1. 15:27

인프런의 자바(Java)알고리즘 문제풀이 입문:코딩테스트 대비 강좌의 문제를 풀고 문제 해설을 작성해보았습니다.

 

섹션2. Array(1,2차원 배열)의 10. 봉우리 강의편 입니다.

 

설명

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

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

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

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

입력

첫 줄에 자연수 N이 주어진다.(2<=N<=50)

두 번째 줄부터 N줄에 걸쳐 각 줄에 N개의 자연수가 주어진다. 각 자연수는 100을 넘지 않는다.

 

출력

봉우리의 개수를 출력하세요.

 

import java.util.Scanner;

public class 봉우리 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int num = sc.nextInt();
		int [][] arrNum = new int[num+2][num+2];
		//자연수 크기만큼 배열에 저장 
		for(int i = 1; i<num+1; i++) {
			for(int j = 1; j<num+1; j++) {
				arrNum[i][j] = sc.nextInt();			
			}
		}
		
		//격자의 가장 자리 0으로 초기화 
		for(int i = 0; i<num+2; i++) {
			for(int j = 0; j<num+2; j++) {
				if(i==0) {
					arrNum[i][j] = 0;
					arrNum[j][i] = 0;
				}
				if(i == num+1) {
					arrNum[i][j] = 0;
					arrNum[j][i] = 0;
				}
			}
		}
		
		System.out.println(solution(num, arrNum));
	}
	public static int solution(int num, int[][] arrNum) {
		//봉우리 갯수 저장
		int cnt = 0;
		for(int i = 1; i<num+1; i++) {
			for(int j = 1; j<num+1; j++) {
				if(
					(arrNum[i][j] > arrNum[i-1][j]) && //상 
					(arrNum[i][j] > arrNum[i][j-1]) && //좌
					(arrNum[i][j] > arrNum[i][j+1]) && //우
					(arrNum[i][j] > arrNum[i+1][j])) { //하 
					cnt++;
				}
			}
		}
		
		return cnt;
	}

}

>> 해설 

n*n 격자판의 가장 자리를 0으로 초기화 시켜주기 위해 입력 받은 num의 +2 크기 만큼의 2차원 배열을 생성한다.

1~ num+1 만큼 2차원 배열에 숫자를 입력한다.

격자판의 가장자리를 0으로 세팅한다.

격자판의 현재 위치에 있는 값이  상하좌우에 있는 값과 비교해서 큰 경우 cnt수를 늘린다.

배열의 현재 위치가 arr[i][j] 일 때

상 : arr[i-1][j]           좌 : arr[i][j-1]            우 : arr[i][j+1]          하 : arr[i+1][j] 

이므로 이 배열 위치 값들보다 arr[i][j] 값이 큰지 비교한다.