본문 바로가기

코딩 테스트/BAEKJOON

[Java] 16931 겉넓이 구하기

문제

문제
크기가 N×M인 종이가 있고, 종이는 1×1크기의 칸으로 나누어져 있다. 
이 종이의 각 칸 위에 1×1×1 크기의 정육면체를 놓아 3차원 도형을 만들었다.

종이의 각 칸에 놓인 정육면체의 개수가 주어졌을 때, 
이 도형의 겉넓이를 구하는 프로그램을 작성하시오.

위의 그림은 3×3 크기의 종이 위에 정육면체를 놓은 것이고, 겉넓이는 60이다.

입력
첫째 줄에 종이의 크기 N, M이 주어진다. 
둘째 줄부터 N개의 줄에는 종이의 각 칸에 놓인 정육면체의 수가 주어진다.

출력
첫째 줄에 도형의 겉넓이를 출력한다.

문제 풀이

기본골자는 위, 아래, 좌우전후 6방향에서 검사를 진행하여 각 면의 겉넓이를 구하는 것.

겉넓비 구하는 공식은 아래처럼 한다.

  1. 맨 앞의 면은 겉넓이에 그냥 더한다.2.
  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