YataNox
[Java] 16931 겉넓이 구하기 본문
문제
문제
크기가 N×M인 종이가 있고, 종이는 1×1크기의 칸으로 나누어져 있다.
이 종이의 각 칸 위에 1×1×1 크기의 정육면체를 놓아 3차원 도형을 만들었다.
종이의 각 칸에 놓인 정육면체의 개수가 주어졌을 때,
이 도형의 겉넓이를 구하는 프로그램을 작성하시오.
위의 그림은 3×3 크기의 종이 위에 정육면체를 놓은 것이고, 겉넓이는 60이다.
입력
첫째 줄에 종이의 크기 N, M이 주어진다.
둘째 줄부터 N개의 줄에는 종이의 각 칸에 놓인 정육면체의 수가 주어진다.
출력
첫째 줄에 도형의 겉넓이를 출력한다.
문제 풀이
기본골자는 위, 아래, 좌우전후 6방향에서 검사를 진행하여 각 면의 겉넓이를 구하는 것.
겉넓비 구하는 공식은 아래처럼 한다.
- 맨 앞의 면은 겉넓이에 그냥 더한다.2.
- 바로 뒷 쪽의 높이에서 앞 쪽의 높이를 뺀다.
- 이 때 뺀 값이 양수일 때만 겉넓이에 더한다.
위 아래 면은 그냥 면적의 크기를 더하면 된다.
자바 코드
import java.util.*;
import java.io.*;
public class Main {
static int N, M;
static int[][] map;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
map = new int[N][M];
int sum = 0; // 겉넓이
for(int i=0; i<N; i++) {
st = new StringTokenizer(br.readLine(), " ");
for(int j=0; j<M; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
if(map[i][j] != 0) {
sum++;
}
}
}
sum *= 2; // 아래에서 바라본 방향, 위에서 바라본 방향은 그냥 더해주면 됨
//동 쪽에서 바라봄
for(int i=0; i<N; i++) {
for(int j=M-1; j>=1; j--) {
int space = map[i][j-1] - map[i][j]; // 바로 뒷 칸의 높이에서 앞 칸의 높이를 빼면 겉넓이가 된다.
if(space >= 0) { // 겉넓이가 양수일 때만 총 겉넓이에 더해주면 된다.
sum += space;
}
}
sum += map[i][M-1]; // 가장 앞쪽에 있는 면은 그냥 더해주면 된다.
}
//서 쪽에서 바라봄
for(int i=0; i<N; i++) {
for(int j=0; j<=M-2; j++) {
int space = map[i][j+1] - map[i][j];
if(space >= 0) {
sum += space;
}
}
sum += map[i][0];
}
//남 쪽에서 바라봄
for(int j=0; j<M; j++) {
for(int i=N-1; i>=1; i--) {
int space = map[i-1][j] - map[i][j];
if(space >= 0) {
sum += space;
}
}
sum += map[N-1][j];
}
//북 쪽에서 바라봄
for(int j=0; j<M; j++) {
for(int i=0; i<=N-2; i++) {
int space = map[i+1][j] - map[i][j];
if(space >= 0) {
sum += space;
}
}
sum += map[0][j];
}
System.out.println(sum);
}
}
'코딩 테스트 > BAEKJOON' 카테고리의 다른 글
[Java] 16926 배열돌리기 1 (0) | 2024.05.09 |
---|---|
[Java] 2290 LCD Test (0) | 2024.05.09 |
[Java] 16967 배열 복원하기 (0) | 2024.05.07 |
[Java] 16920 확장게임 (0) | 2024.05.02 |
[Java] 12851 숨바꼭질 2 (0) | 2024.04.30 |