알고리즘/백준

백준 16931 : 겉넓이 구하기 Java

코드 공작소 2023. 7. 15. 15:28
반응형

www.acmicpc.net/problem/16931

 


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
1 초 512 MB 319 232 184 73.016%

문제

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

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

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


입력

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


출력

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


제한

  • 1 ≤ N, M ≤ 100
  • 1 ≤ 종이의 한 칸에 놓인 정육면체의 수 ≤ 100

예제 입력

예제 출력

1 1
1
6
3 3
1 3 4
2 2 3
1 2 4
60

풀이 과정

 

겉넓이를 구할때 윗면과 아랫면은 무조건 더해준다. 그 외는 4방 탐색을 통해 범위 안에 있을 경우 높이차를 더해주며 탐색하지 못하는 경우 해당 면에 블록이 없는 것이기 때문에 그대로 더해준다.


Java 코드

import java.util.Scanner;
/*
https://www.acmicpc.net/problem/16931
겉넓이 구하기
 */
public class Main {

	public static void main(String[] args) {
	Scanner sc = new Scanner(System.in);

	int dx[] = { 0, 0, 1, -1 };
	int dy[] = { 1, -1, 0, 0 };	    
		
        int N = sc.nextInt();		//종이의 크기
        int M = sc.nextInt();		//종이의 크기
        int count =0;				//결과값 저장
        int arr[][] = new int[N][M];
        
        for (int i = 0; i < N; i++) {
			for (int j = 0; j < M; j++) {
				arr[i][j] = sc.nextInt();
			}
		}
 
        for (int i = 0; i < N; i++) {
			for (int j = 0; j < M; j++) {
				for (int k = 0; k < 4; k++) {	//탐색
					int nx = i+dx[k];
					int ny = j+dy[k];
					
					if(nx >= 0 && nx< N && ny>=0&& ny<M) {	//탐색 범위 안에 있을 경우
						if(arr[nx][ny] < arr[i][j]) {		//
							count += (arr[i][j] - arr[nx][ny]);
						}
					}
					else count += arr[i][j];				//범위 밖
				}
			}
		}
        
        count += 2*N*M;			//윗면과 아랫면은 무조건 더하기
        
        
        System.out.println(count);
        

	}

}

 

반응형