반응형
| 시간 제한 | 메모리 제한 | 제출 | 정답 | 맞은 사람 | 정답 비율 |
| 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);
}
}
반응형
'알고리즘 > 백준' 카테고리의 다른 글
| 백준 16926 : 배열 돌리기 1 Java (0) | 2023.07.17 |
|---|---|
| 백준 17204 : 죽음의 게임 Java (0) | 2023.07.16 |
| 백준 1966 : 프린터 큐 Java (0) | 2023.07.14 |
| 백준 10988 : 팰린드롬인지 확인하기 Java (0) | 2023.07.13 |
| 백준 8320 : 직사각형을 만드는 방법 Java (0) | 2023.07.12 |