BOJ[16931] - 겉넓이 구하기 by JavaScript
겉넓이 구하기
문제
언어
- JavaScript
순서도
- 위쪽 면, 아래 쪽 면 구하기
- 왼쪽 면, 가운데 면, 오른쪽 면 구하기
- 앞쪽 면, 가운데 면, 뒤쪽 면 구하기
문제 풀이 step 1
- 중학교 수학 문제와 유사한 문제로 그 시절의 수학적인 개념이 기억난다면 수월하게 풀 수 있는 문제인 것 같습니다.
- 간단하게 생각해볼 부분은
- 위쪽 면 : 위에서 내려다볼 때 보이는 면 모두
- 아래쪽 면 : 아래에서 올려다볼 때 보이는 면 모두
- 앞쪽 면 : 앞에서 볼 때 가장 가까운 면 모두
- 뒤쪽 면 : 뒤에서 볼 때 가장 가까운 면 모두
- 왼쪽 면 : 왼쪽에서 볼 때 가장 가까운 면 모두
- 오른쪽 면 : 오른쪽에서 볼 때 가장 가까운 면 모두
- 이렇게 총 6 가지 입니다.
문제 풀이 step 2
- 추가적으로 가운데 면을 세어주면 됩니다.
- 가운데 면에는
- 앞쪽 면과 뒤쪽 면 사이에 있는 가운데 면들
- 왼쪽 면과 오른쪽 면 사이에 있는 가운데 면들
- 이렇게 총 2 가지가 있습니다.
문제 풀이 step 3
- 가운데 면을 제외한 부분은 그냥 세면 되기 때문에 넘어가고, 가운데 면만 설명하겠습니다.
- 가운데 면은 사진 상에서 파란색 화살표로 가리킨 면들을 얘기합니다.
- 그렇다면, 가운데 면은 어떻게 구해야할까요??
- 가운데 면을 기준으로 양옆의 기둥의 높이 차이가 바로 가운데 면의 개수가 됩니다.
- 그림을 배열 형태로 바꾸면
[ [4, 3, 4], [3, 2, 2], [1, 2, 1], ]; - 이런 모습일 것입니다.
- 그림을 배열 형태로 바꾸면
- 그렇다면 왼쪽 면과 오른쪽 면 사이에 있는 가운데 면들 중에서 첫 번째 가운데 면의 개수는
Math.abs(4 - 3) + Math.abs(3 - 2) + Math.abs(1 - 2)로 총 3 개입니다.
- 그리고 왼쪽 면과 오른쪽 면 사이에 있는 가운데 면들 중에서 두 번째 가운데 면의 개수는
Math.abs(3 - 4) + Math.abs(2 - 2) + Math.abs(2 - 1)로 총 2 개 입니다.
- 따라서 왼쪽 면과 오른쪽 면 사이에 있는 가운데 면들의 총 개수는 5 개 입니다.
문제 풀이 step 4
- 위의 경우에 따라서 모든 면의 개수를 다 구해서 합하고 출력하면 정답이 됩니다.
소스 코드
const input = require("fs")
.readFileSync("/dev/stdin")
.toString()
.trim()
.split("\n");
const solution = (input) => {
const [n, m] = input[0].split(" ").map(Number);
const arr = input.slice(1).map((v) => v.split(" ").map(Number));
let cnt = 0;
// 위쪽 면, 아래쪽 면 구하기
cnt += n * m * 2;
// 왼쪽 면, 가운데 면, 오른쪽 면 구하기
// 왼쪽 면, 오른쪽 면
for (let i = 0; i < n; i++) {
cnt += arr[i][0] + arr[i][m - 1];
}
// 가운데 면
for (let j = 1; j < m; j++) {
for (let i = 0; i < n; i++) {
cnt += Math.abs(arr[i][j - 1] - arr[i][j]);
}
}
// 앞쪽 면, 가운데 면, 뒤쪽 면 구하기
// 앞쪽 면, 뒤쪽 면
for (let j = 0; j < m; j++) {
cnt += arr[0][j] + arr[n - 1][j];
}
// 가운데 면
for (let i = 1; i < n; i++) {
for (let j = 0; j < m; j++) {
cnt += Math.abs(arr[i - 1][j] - arr[i][j]);
}
}
return cnt;
};
console.log(solution(input));