인프런 커뮤니티 질문&답변

진욱님의 프로필 이미지
진욱

작성한 질문수

자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)

7. 봉우리

질문이 있어서 남겨봅니다..

작성

·

257

·

수정됨

0

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.

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

알려주신 것처럼 flag 변수로 아닌 것을 찾아서 숫자를 늘려주는 것과 맞는 경우에 늘려주는 것이 어떤 차이가 있는건지 헷갈리네요...

답변 1

0

김태원님의 프로필 이미지
김태원
지식공유자

안녕하세요^^

function solution(arr) {
    let answer = 0;
    let dx = [-1, 0, 1, 0];
    let dy = [0, -1, 0, 1];
    for (let i = 2; i <= 2; i++) {
      for (let j = 2; j <= 2; j++) {
        for (let k = 0; k < 4; k++) {
          let nx = i + dx[k];
          let ny = j + dy[k];
          if (
            nx >= 0 &&
            nx < arr.length &&
            ny < arr.length &&
            ny >= 0 &&
            arr[i][j] > arr[nx][ny]
          ) {
            answer++;
          }
        }
      }
    }
    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));

위에 코드처럼 하면 2중 for문이 2행 2열의 값 즉 arr[2][2]의 값 5만 한 번 탐색하고 끝나는 2중 for문입니다. 그리고 answer의 값은 arr[2][2]의 네 방향으로 인접한 격자값과 arr[2][2]과 비교해서 인접한 4방향의 격자값이 arr[2][2]의 값보다 작은 경우의 수를 구하고 있습니다. 아마 위에 코드를 실행하면 3이 나올겁니다. arr[2][2]의 인접한 4개의 값 1, 3, 6, 2(12시방향부터 시계방향으로) 중 arr[2][2]의 값 5보다 작은 경우는 1, 3, 2 이렇게 3개이기 때문입니다. 결론적으로 님이 올려주신 코드는 모든 격자에서 위와 같이 4방향을 탐색하면서 자신보다 값이 작은 격자가 발견될 경우 1씩 증가하는 answer값을 구하고 있는 코드입니다.

 

진욱님의 프로필 이미지
진욱

작성한 질문수

질문하기