[프로그래머스] Lv.0 안전지대
https://school.programmers.co.kr/learn/courses/30/lessons/120866
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제
코드
function solution(board) {
let answer = 0;
let explosion = [
[-1,-1], [-1,0], [-1,1],
[0,-1], [0,1],
[1, -1], [1,0], [1,1]
]
for(let i = 0; i < board.length; i++){
for(let j = 0; j < board.length; j++){
if(board[i][j] == 1){
explosion.forEach(e => {
let [x,y] = e;
[x,y] = [i+x, j+y];
if(x >= 0 && x < board.length && y >= 0 && y < board.length && board[x][y] == 0) {
board[x][y] = 2
}
})
}
}
}
for(let i = 0; i < board.length; i++){
board[i].forEach(v => {
if(v == 0) {
answer++;
}
})
}
return answer;
}
1. board[i][j]를 확인하여 1인지 확인
2. explosion(폭발 범위)를 순회하며 폭발 위치를 찾기
3. 2에서 찾은 폭발 위치가 board의 범위를 넘어가지 않는지 확인, 0인지 확인 => 범위를 넘어가지 않고 0이면 2로 바꿈
4. 0의 개수 세기
다른 풀이 방법
* 지뢰를 기준으로 주변을 보는게 아니고 주변에 지뢰가 있는지 확인하는 접근
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;
}
1. forEach 메서드를 사용해 board의 각 행을 순회하고, 각 행의 각 셀을 순회
2. 현재 셀의 값이 1이면 루프를 종료
3. 현재 셀의 값이 0이면, 외부 주변에 장애물이 있는지 확인. 이를 위해 some 메서드를 사용하여 외부 주변을 순회
4. 외부 주변에 장애물이 하나라도 있으면 해당 셀은 안전한 영역이 아님
5. 외부 주변에 장애물이 없으면 해당 셀은 안전한 영역으로 간주하고 safezone 변수를 증가
6. 안전한 영역의 개수를 반환
* self[oy + y]?.[ox + x]는 외부 주변 셀이 존재하는지 확인하며, 옵셔널 체이닝 연산자를 사용하여 보드를 벗어나는 경우를 방지함
따라서 외부 주변에 장애물이 하나라도 존재하면 some 함수는 true를 반환하고, 그렇지 않으면 false를 반환한다.
반환된 값에 따라 조건 연산자를 통해 결과가 결정된다.
- 만약 외부 주변에 장애물이 있으면 (some 함수가 true를 반환하면), 현재 셀은 안전한 영역이 아니므로 false를 반환한다.
- 그렇지 않으면 (some 함수가 false를 반환하면), 현재 셀은 안전한 영역이므로 safezone 변수를 증가시킨다.
Some()이란?
some() 함수는 배열의 1개 요소라도 특정 조건을 충족하는지 확인(OR)하는데 사용
옵셔널 체이닝
Optional chaining 연산자 ?.는 체인의 각 참조가 유효한지 명시적으로 검증하지 않고, 연결된 객체 체인 내에 깊숙이 위치한 속성 값을 읽을 수 있다.
?.은 ?.앞의 평가 대상이 undefined나 null이면 평가를 멈추고 undefined를 반환한다.
!!
!!는 값을 불린(Boolean) 값으로 변환하는 연산자
회고
1의 풀이 방법은 길지만 가독성이 좋고
2의 풀이 방법은 짧지만 이해하기 어렵고 가독성이 떨어진다
개인적으론 1의 방법이 더 좋다고 생각한다.