백준 크냑과 3D 프린터

KIMYEONGJUN·2026년 4월 19일
post-thumbnail

문제

내가 생각했을때 문제에서 원하는부분

첫째 줄에 히스토그램을 이루는 막대의 개수를 의미하는 정수 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();
    }
}

마무리

코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.

profile
Junior backend developer

0개의 댓글