본문 바로가기
Algorithm

[4방향 탐색] 봉우리

by Robinkim93 2023. 2. 3.

# 문제

각 요소는 그 지역이 높이이다. 요소의 상하좌우의 값이 해당 요소보다 작다면 해당 요소는 봉우리 지역이다. 봉우리 지역에 해당하는 요소의 갯수는 몇 개인지 알아내는 프로그램을 작성하시오.

 

# 입력값

let arr = [
  [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],
];

# 풀이

function solution(arr) {
  let answer = 0;
  let length = arr.length;
  // 상하좌우 순
  let dx = [0, 0, -1, 1];
  let dy = [-1, 1, 0, 0]; // --(2)
  for (let i = 0; i < length; i++) {
    for (let j = 0; j < length; j++) { // --(1)
      let flag = 1; // --(5)
      for (let k = 0; k < 4; k++) { // --(2)
        let nx = i + dx[k];
        let ny = j + dy[k];  // --(3)
        if (
          nx >= 0 &&
          nx < length &&
          ny >= 0 &&
          ny < length &&
          arr[i][j] <= arr[nx][ny] // --(4)
        ) {
          flag = 0; // --(6)
          break;
        }
      }
      if (flag) answer++; // --(7)
    }
  }
  return answer;
}

let arr = [
  [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],
];

## 1. 이중 for문을 돌려서 arr[i][j] 로 전체 요소를 좌표처럼 탐색할 수 있다.

 

## 2. dx, dy를 선언하고 상하좌우로 움직일 수 있도록 배열로 선언해준다.

(i는 x축, j를 y축으로 했을 때 dx, dy로 상하좌우의 값을 반환받을 수 있도록)

 

## 3. 또 다시 for문을 돌려서 dx, dy의 길이만큼 돌리고, i + dx[k]와 j + dy[k]로 상하좌우의 값들을 정의해준다.

 

## 4. 먼저는 맨 밑에 비교문을 써줬는데, 현재 좌표와 4방향으로 움직였을 때 좌표의 값을 비교해서 현재 좌표의 값이 작거나 같으면 봉우리가 아니라는 답을 얻을 수 있다. 또한, 배열의 인덱스는 0보다 작아질 수 없고, 배열의 길이보다 커질 수 없기 때문에 && 연산자를 통해 범위를 설정해줄 수 있다.

 

##  5. k의 값을 가진 for문이 돌기 전에 flag를 선언해줬는데, 1은 true, 0은 false라는 것을 이용해주기 위해 1로 선언한다.

 

##  6. 4번과 같이 봉우리가 아니라는 답을 얻을 경우에는 flag를 0으로 재선언하고 break문으로 if문을 멈춰준다.

 

##  7. 다시 k의 값을 가진 for문이 끝나고 나서 flag의 값을 확인해서 true라면 answer에 1을 더해주고, false라면 다시 i와 j의 for문이 돌게끔 작성해준다. (flag의 값이 true라면 봉우리라는 뜻이기 때문)

 

# 풀이 간 Learning Point

 

## 1. if문 작성 시 여러 문장을 실행시킬 것이라면 중괄호를 써줘야 제대로 적용이 된다. 가독성을 위해서라도 중괄호는 실행문이 한 줄이라도 작성해주는 것이 좋음.

 

## 2. 4방향 탐색에서는 dx, dy처럼 4방향에 대한 값을 받을 수 있는 배열을 추가로 선언해서 움직여준다는 것.