[Javascript 코딩테스트][프로그래머스 Lv.0] 안전지대

uddi·2023년 9월 13일
0

코딩테스트 Javascript

목록 보기
11/11

📌 문제

안전지대

🔑 풀이

  • board가 n*n 크기의 2차원 배열이므로, 같은 크기의 arr 배열을 만든 후 0으로 초기화한다
  • board[i][j]의 값이 1이면 해당 인덱스와 상하좌우 대각선에 해당하는 인덱스를 1로 바꾼다
  • 해당 인덱스의 값이 1인 경우는 지뢰가 있는 곳이므로 값이 0인 경우만 1로 바꿔줘도 된다
  • arr 배열에서 forEach문을 사용해 값이 0이면 answer을 1씩 늘려준다

💻 코드

function solution(board) {
    var answer = 0;
    let arr = Array.from(Array(board.length), () => Array(board.length).fill(0));
  
    for(let i=0; i<board.length;i++){
        for (let j=0; j<board[i].length; j++){
            if(board[i][j]==1){
                arr[i][j]=1;
                arr[i]?.[j-1]==0 && (arr[i][j-1]=1)
                arr[i]?.[j+1]==0 && (arr[i][j+1]=1)
                arr[i-1]?.[j]==0 && (arr[i-1][j]=1)
                arr[i-1]?.[j-1]==0 && (arr[i-1][j-1]=1)
                arr[i-1]?.[j+1]==0 && (arr[i-1][j+1]=1)
                arr[i+1]?.[j]==0 && (arr[i+1][j]=1)
                arr[i+1]?.[j-1]==0 && (arr[i+1][j-1]=1)
                arr[i+1]?.[j+1]==0 && (arr[i+1][j+1]=1)
                }
        }
    }
    
    arr.forEach(a=>a.forEach(b=>b==0 && (answer+=1)))
    
    return answer;
}

📖 사용 문법 정리

💡 forEach( ) : 각 배열 요소에 대해 제공된 함수를 한 번씩 실행

  • 첫 번째 파라미터 : 현재 요소 (배열의 값)
  • 두 번째 파라미터 : 현재 요소의 인덱스 (optional)
  • 세 번째 파라미터 : forEach( )를 호출한 배열 (optional)

💡 옵셔널 체이닝 ( ?. ) : 프로퍼티가 없는 중첩 객체를 에러 없이 안전하게 접근할 수 있는 연산자

  • ?. 의 앞에 있는 값이 undefined 거나 null 이면 에러 발생 대신 undefined를 리턴한다

🥹 정리

정말 어렵고 생각을 많이 해봐야 하는 문제였던 것 같다.

처음에는 if문 남발에 노가다로 풀어서 코드도 엄청 길어지고 산으로 가는 느낌이었는데, 다시 알고리즘을 정리한 뒤 새롭게 푸니까 풀렸던 문제!

지뢰가 가장자리에 존재하는 경우 배열 인덱스가 존재하지 않아서 난관이었다.
그래도 옵셔널 체이닝으로 좀 더 짧게 코드를 짤 수 있었던 것 같다.

profile
거북이는 느리지만 결국 결승선을 통과한다

0개의 댓글