프라이D 2022. 1. 31. 01:53

문제

n*n격자판에서 자신의 상하좌우 숫자보다 큰 숫자가 몇개 있는지 출력하세요!

(격자의 가장자리는 0으로 초기화)

풀이

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; //돌기 전 flag값 초기화
            for (let k = 0; k < 4; k++) {
              //4번만큼 돌며 사방탐색
              let nx = i + dx[k]; //사방탐색 행의 위치
              let ny = j + dy[k]; //사방탐색 열의 위치
              if (
                nx >= 0 &&
                ny >= 0 && //탐색 대상이 0 이상
                nx < n &&
                ny < n && //탐색 대상이 배열의 범위 내
                arr[i][j] < arr[nx][ny]
                //자신보다 하나라도 큰 것이 있다면 탐색종료
              ) {
                flag = 0;
                break;
              }
            }
            if (flag) answer++; //k탐색을 마쳤는데 flag가 그대로라면 작은 것이 없다는 것 = 자신이 봉우리라는 뜻.
          }
        }

        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],
      ];
      console.log(solution(arr));