[프로그래머스] 안전지대

Jang·2023년 3월 24일
0

백준

목록 보기
6/6


https://school.programmers.co.kr/learn/courses/30/lessons/120866

내 풀이

  • 이중 반복문을 통해 (0,0)~(n,n)을 하나씩 체크
  • 만약 1(지뢰)인 경우 그 주변을(3x3) 또다시 탐색
  • 이 때 탐색한 칸이 0인 경우 값을 2로 바꿔줌 (지뢰와 구분)
  • 모든 반복이 끝난 후 foreach와 reduce를 이용해 0인 칸의 갯수를 구함
  let n = board.length;
  let answer = 0;

  for (let x = 0; x < n; x++) {
    for (let y = 0; y < n; y++) {
      
      if (board[x][y] == 1) {
        
        for (let i = x - 1; i <= x + 1; i++) {
          for (let j = y - 1; j <= y + 1; j++) {
              
            if (board[i]?.[j] == 0) {
              board[i][j] = 2;
            }
              
          }
        }
      }
    }
  }

  board.forEach((v, i) => {
    answer += v.reduce((a, b) => a + (b == 0), 0);
  });

  return answer;
}

결과

코딩테스트에는 통과하였으나 반복문이 4번이나 중첩되어 코드가 지저분하였고 0단계인 문제를 이렇게 복잡하게 푸는게 맞나 싶어서 다른 사람의 풀이를 찾아 보았다.

다른 사람의 풀이

일단 forEach를 쓰니 훨씬 간결해졌고 밑의 부분은
보고도 이해가 잘 가지 않아서 chatGPT에 해석을 부탁해보았다.

알게된 것

  • some함수의 사용법
  • !! -> 불리언으로의 강제 변환 (!를 두번 사용)

0개의 댓글