description
1) 정사각형 모양의 2차원 배열이 주어지고, 폭탄이 있는 곳엔 1, 그 외엔 0
2) 폭탄이 있는 곳을 기준으로 사각형 테두리 칸들은 위험지대
3) 폭탄 + 위험지대를 제외한 안전지대의 칸 수?
풀이
0) 단순하게 접근했다, 일단 풀고 봐야지하는 마음에...
1) forEach를 중첩하여 사용해서 하나씩 확인 후, 1이 있으면 그 테두리들을 -1로 변경
2) 1을 진행하며 외곽라인(예외처리)들을 체크해주면서 진행, 그리고 1인 것들은 그대로 1로 둠
3) 마지막에 다시 forEach를 중첩하여 0들을 체크
정답을 제출한 뒤에, 어떤 다른 풀이가 있을까? 어떻게 간결하게 짤 수 있을까?하는 생각에 다른 분들의 코드를 확인해보았다.
위 코드를 분석해보자
** 먼저 낯선 some과 forEach 세번째 매개변수 **
// developer.mozilla.org
some() 메서드는 배열 안의 어떤 요소라도 주어진 판별 함수를 적어도 하나라도 통과하는지 테스트합니다. 만약 배열에서 주어진 함수가 true을 반환하면 true를 반환합니다. 그렇지 않으면 false를 반환합니다. 이 메서드는 배열을 변경하지 않습니다.
// developer.mozilla.org
arr.forEach(callback(currentvalue[, index[, array]])[, thisArg])
매개변수callback각 요소에 대해 실행할 함수. 다음 세 가지 매개변수를 받습니다.
currentValue - 처리할 현재 요소 / index - 처리할 현재 요소의 인덱스 / array - forEach()를 호출한 배열 / thisArg - callback을 실행할 때 this로 사용할 값
0) outside는 현재 y, x인덱스와 합산했 때의 테두리 선, 총 8개
1) self, 즉 board에서 자기를 기준으로 테두리선을 확인한 뒤에, 하나라도 1이면(폭탄이 테두리에 있으면) false를 반환하고 그게 아니면 카운트를 업
2) some을 통해 반복문을 아꼈다!
메소드 정리
1. forEach(현재 요소, 현재 인덱스, forEach를 호출한 배열 self)
2. some() 조건에 하나라도 요소가 부합하면 true반환 => or 연산을 한다고 생각하자
// https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/some
const array = [1, 2, 3, 4, 5];
// Checks whether an element is even
// 하나라도 짝수면 true 반환
const even = (element) => element % 2 === 0;
console.log(array.some(even));
// Expected output: true
'Algorithm' 카테고리의 다른 글
[프로그래머스] 평행 (0) | 2023.04.28 |
---|---|
[프로그래머스] 옹알이(0) (0) | 2023.04.28 |
Codingbat - Java] String-3 - maxBlock (0) | 2021.10.14 |
Codingbat - Java] Logic2 - blackjack (0) | 2021.10.07 |
Codingbat-Java] Warmup2 - arrayCount9 (0) | 2021.09.30 |