알고리즘 - 지뢰안전지대 개수찾기

James·2022년 12월 7일
0

풀이방법은 2가지가 있다고 생각한다.
첫 째, 0으로 채워진 새로운 이중배열(newBoard)을 만들고, board(이중배열)을 순회하면서 지뢰(1)를 찾으면 상하좌우대각에 1을 채운뒤, newBoard를 순회하며 0의 개수를 count하여 리턴.

둘 째, 지뢰(1)로부터의 상하좌우대각에 대한 상대위치 배열을 미리 정의한 후, board를 순회하며 해당 위치가 상하좌우대각에서 볼 때 지뢰가 없으면 count하여 리턴.

function solution(board) {
  // 지뢰 상하좌우대각에 해당하는 외곽을 모두 정의
  let outside = [
    [-1, 0],
    [-1, -1],
    [-1, 1],
    [0, -1],
    [0, 1],
    [1, 0],
    [1, -1],
    [1, 1],
  ];
  let safezone = 0;

  board.forEach((row, y, self) =>
    row.forEach((it, x) => {
      if (it === 1) return false;
      return outside.some(([oy, ox]) => !!self[oy + y]?.[ox + x])
        ? false
        : safezone++;
    })
  );

  return safezone;
}

첫 번째 방법으로 먼저 코딩해서 문제를 푼 뒤, 어떻게 리팩토링하면 좋을 지 다른 분 풀이를 참고했을 때 별도의 newBoard를 만들어 새로 채워넣을 필요없이 가장 깔끔하게 문제를 풀 수 있는 방법이라 기록하기 위해 포스팅을 남긴다.

profile
웹개발자 James 입니다.

0개의 댓글