
내가 생각했을때 문제에서 원하는부분
첫째 줄에 히스토그램을 이루는 막대의 개수를 의미하는 정수 N이 주어진다. (1 ≤ N ≤ 32768)
둘째 줄에 각 막대의 높이를 의미하는 정수 h_1, h_2, h_N이 공백으로 구분되어 주어진다. (1 ≤ h_i ≤ 32768)
3D 히스토그램 모형의 겉넓이를 출력한다.
내가 이 문제를 보고 생각해본 부분
히스토그램 막대 개수 N과 각 막대의 높이를 입력받는다.
surfaceArea 변수는 겉넓이를 누적할 공간이고, previousHeight는 한 칸 앞 막대 높이를 저장한다.
반복문에서는 현재 막대 높이를 꺼내며 다음 내용을 더한다.
현재 막대 높이와 이전 막대 높이의 차이 절댓값: 막대 사이 옆면 노출되는 면적이다.
현재 막대 앞면과 뒷면 면적: 높이 * 2 (너비 1, 깊이 1이므로 둘 다 면적에 포함)
윗면과 아랫면은 막대 하나당 2씩 누적한다.
이전 막대 높이를 현재 막대 높이로 갱신하여 다음 계산을 준비한다.
모든 막대를 순회한 뒤, 오른쪽 끝 막대의 옆면도 따로 더해 준다.
최종 surfaceArea를 출력한다.
코드로 구현
package baekjoon.baekjoon_34;
import java.io.*;
import java.util.StringTokenizer;
// 백준 30923번 문제
public class Main1365 {
public static void main(String[] args) throws IOException {
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine()); // 막대 개수
long surfaceArea = 0, previousHeight = 0;
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
long currentHeight = Long.parseLong(st.nextToken());
surfaceArea += Math.abs(currentHeight - previousHeight); // 옆면 차이 부분
surfaceArea += currentHeight * 2; // 앞면과 뒷면
surfaceArea += 2; // 윗면과 아랫면(각 막대마다)
previousHeight = currentHeight;
}
surfaceArea += previousHeight; // 마지막 오른쪽 끝 옆면
bw.write(String.valueOf(surfaceArea));
bw.close();
br.close();
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.