알고리즘

11월 3일 1문제 - Java : Array

1. 봉우리

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

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

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

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


2차원 배열은 익숙하지 않아서 방향을 우째 for문에 담아야할지 감이 안와서 강의를 봤는데 

보통 이런 문제에서는 배열에 방향을 먼저 담아 두고 그걸로 2중 for문을 돌아야 한다고 한다.

 

 

import java.util.Scanner;

public class Test02_10 {

  public int solution(int[][] numberArray, int num) {
    // 상하좌우
    int[] x = {-1, 0, 1, 0};
    int[] y = {0, 1, 0, -1};
    int result = 0;

    for (int i = 0; i < num; i++) {
      for (int j = 0; j < num; j++) {
        boolean check = true;
        for (int k = 0; k < 4; k++) {
        // 해당 위치에 있는 상하좌우를 보기 위해 + 해줌
          int targetX = i + x[k];
          int targetY = j + y[k];
          // 밖에 있는 숫자 들은 상하좌우를 보면 index가 - 가 되거나 오버 되기 때문에 미리 걸러줌
          if (targetX >= 0
              && targetX < num
              && targetY >= 0
              && targetY < num
              && numberArray[i][j] <= numberArray[targetX][targetY]) {
            check = false;
            break;
          }
        }
        if (check) result++;
      }
    }

    return result;
  }

  public static void main(String[] args) {
    Test02_10 main = new Test02_10();
    Scanner sc = new Scanner(System.in);
    int num = sc.nextInt();
    int[][] numberArray = new int[num][num];
    for (int i = 0; i < num; i++) {
      for (int j = 0; j < num; j++) {
        numberArray[i][j] = sc.nextInt();
      }
    }
    System.out.println(main.solution(numberArray, num));
  }
}