Algorithm/Problem Solving

[JS] 봉우리

SH_Roh 2021. 9. 9. 12:49
반응형

문제

지도 정보가 N*N 격자판에 주어진다. 각 격자에는 그 지역의 높이가 쓰여있고, 각 격자판의 숫자 중 자신의 상하좌우 숫자보다 큰 숫자는 봉우리 지역이다. 봉우리가 몇 개 있는지 알아내는 프로그램을 작성하시오. (1<=N<=50)

 

입력예시

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

정답

function solution(arr) {
  let answer = 0;
  let n = arr.length;
  let dx = [-1, 0, 1, 0];
  let dy = [0, 1, 0, -1];
  for (let i = 0; i < n; i++) {
    for (let j = 0; j < n; j++) {
      let flag = 1;
      for (let k = 0; k < 4; k++) {
        let nx = i + dx[k];
        let ny = j + dy[k];
        if (
          nx >= 0 &&
          nx < n &&
          ny >= 0 &&
          ny < n &&
          arr[nx][ny] >= arr[i][j]
        ) {
          flag = 0;
          break;
        }
      }
      if (flag) answer++;
    }
  }
  return answer;
}

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],
];

 

arr[i][j]의 상하좌우를 확인하기 위해서 dx, dy 배열을 선언해주고 [i-1][j], [i][j+1], [i+1][j], [i][j-1] 네가지 경우를 계산하기 위해 dx=[-1, 0, 1, 0], dy=[0, 1, 0, -1]을 넣어준다.

이중 for문을 이용해 2차원 배열을 탐색하면서 그 안에서 k=0~3까지 for문을 돌면서 dx, dy를 이용해 상하좌우를 확인해준다.

만약 상하좌우 중에 현재의 값보다 큰 값이 있다면 flag를 0으로 바꿔주고 (k가 있는 for문을) break 해준다. (이 때, 모서리 부분일 수도 있으므로, nx, ny가 0보다 크거나 같아야 하며, n보다는 작아야 한다.)

k가 있는 for문이 다 돌았을 때까지 flag가 1이라면 봉우리인 것이므로 answer++을 해준다.

 

본 문제는 아래의 인프런 자바스크립트 알고리즘 문제풀이 강의의 내용입니다. 자바스크립트로 코딩테스트를 준비중이시라면 꼭 들어보시는 것을 추천드려요!

 

자바스크립트 알고리즘 문제풀이(코딩테스트 대비) - 인프런 | 강의

자바스크립트(JavaScript)로 코딩테스트를 준비하시는 분을 위한 강좌입니다. 재미있게 풀 수 있는 기초 단계 문제부터 고급 알고리즘까지 단계별로 차근차근 배우도록 설계된 강좌입니다., 개발

www.inflearn.com

 

반응형