프로그래머스 0단계 - 안전지대 본문
반응형
0 단계 : 안전지대
코딩테스트 연습 > 코딩테스트 입문 > 안전지대
다음 그림과 같이 지뢰가 있는 지역과 지뢰에 인접한 위, 아래, 좌, 우 대각선 칸을 모두 위험지역으로 분류합니다.
지뢰는 2차원 배열 board
에 1로 표시되어 있고 board
에는 지뢰가 매설 된 지역 1과, 지뢰가 없는 지역 0만 존재합니다.
지뢰가 매설된 지역의 지도 board
가 매개변수로 주어질 때, 안전한 지역의 칸 수를 return하도록 solution 함수를 완성해주세요.
제한사항
board
는 n * n 배열입니다.- 1 ≤ n ≤ 100
- 지뢰는 1로 표시되어 있습니다.
board
에는 지뢰가 있는 지역 1과 지뢰가 없는 지역 0만 존재합니다.
입출력 예
board | result |
---|---|
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 1, 0, 0], [0, 0, 0, 0, 0]] | 16 |
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 1, 1, 0], [0, 0, 0, 0, 0]] | 13 |
[[1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1]] | 0 |
입출력 예 설명
입출력 예 #1
- (3, 2)에 지뢰가 있으므로 지뢰가 있는 지역과 지뢰와 인접한 위, 아래, 좌, 우, 대각선 총 8칸은 위험지역입니다. 따라서 16을 return합니다.
입출력 예 #2
- (3, 2), (3, 3)에 지뢰가 있으므로 지뢰가 있는 지역과 지뢰와 인접한 위, 아래, 좌, 우, 대각선은 위험지역입니다. 따라서 위험지역을 제외한 칸 수 13을 return합니다.
입출력 예 #3
- 모든 지역에 지뢰가 있으므로 안전지역은 없습니다. 따라서 0을 return합니다.
반응형
코드
function solution(board) {
const calDanArea = (x, y) => {
// 0보다 작아지면 안되겠죠 -1이라던지
const minLength = 0;
// 보드가 5 * 5라면 최대 가질 수 있는 인덱스는 4겠죠
const maxLength = board.length - 1;
// 본인을 포함하여 주위를 둘러쌓고있는 블럭들 총 9개
const ret = [
[x - 1 ,y - 1],
[x - 1 ,y],
[x - 1 ,y + 1],
[x, y - 1],
[x, y],
[x, y + 1],
[x + 1 ,y - 1],
[x + 1 ,y],
[x + 1 ,y + 1],
];
// 잘못된 인덱스가 들어가있는 배열을 제거하기위해 filter를 수행해줍니다.
// x,y 일때 x건 y건 둘다 0보다 작거나 5 * 5일때 4를 초과해버리면 잘못된 인덱스이니까 제거해줍니다.
return ret.filter(item => {
if(item[0] > maxLength || item[0] < minLength || item[1] > maxLength || item[1] < minLength) {
return false;
} else {
return true;
}
});
}
// 1이 포함되어있는 인덱스를 찾아줍니다.
const mineIndex = board.reduce((prev, curr, index) => {
let rowIndex = index;
for(let i = 0; i < curr.length; i++) {
if(curr[i] === 1) {
prev.push([rowIndex, i]);
}
}
return prev;
}, []);
// 1이들어있는 인덱스를 겹치더라도 아까 만들어둔 calDanArea 9개의 영역을 구하는 함수에 넣습니다.
const dupMineArea = mineIndex.map(item => calDanArea(item[0], item[1]));
// 중복을 제거합니다.
const setify = dupMineArea.flat().reduce((prev, curr) => {
if(!prev.includes(JSON.stringify(curr))) {
prev.push(JSON.stringify(curr));
}
return prev;
}, []);
// 중복을 제거하고 나면 지뢰롤 위험해진 면적이 나올테고 총면적 - setify.length를 해주면 답이나옵니다.
return board.length ** 2 - setify.length
}
리뷰
1. calDanArea 함수의 역할은 두점을 넣었을 때 자신을 포함해 상하좌우 대각선 총 9개의 점들 (위험한점들)을 찾아내는 함수입니다.
2. mineIndex 배열은 board에서 지뢰의 인덱스를 찾습니다.
3. dupMineArea 배열은 mineIndex의 원소하나하나를 calDanArea 함수에 넣은 값을 저장하고있습니다.
4. setify 배열은 중복을 제거한 순수 위험한 칸들만 담고있는 배열입니다.
5. setify까지 구했다면 n*n - setify.length 하면 안전지대의 갯수가 나옵니다.
총평 : 풀고나니까 되게 기네요, 좀 더 단축된 방법이 많을 거라 생각됩니다.
출처 : https://school.programmers.co.kr/learn/courses/30/lessons/120866
반응형
'알고리즘 > 0단계' 카테고리의 다른 글
프로그래머스 0단계 - 이차원 배열 대각선 순회하기 (3) | 2023.06.04 |
---|---|
프로그래머스 0단계 - 왼쪽 오른쪽 (1) | 2023.06.04 |
프로그래머스 0단계 - 배열의 길이를 2의 거듭제곱으로 만들기 (0) | 2023.06.04 |
프로그래머스 0단계 - 배열 만들기2 (2) | 2023.06.04 |
프로그래머스 0단계 - 문자열 묶기 (1) | 2023.06.04 |
Comments