내가 생각했을때 문제에서 원하는부분
첫 줄에는 기둥의 개수를 나타내는 정수 N이 주어진다.
N은 1 이상 1,000 이하이다.
그 다음 N 개의 줄에는 각 줄에 각 기둥의 왼쪽 면의 위치를 나타내는 정수 L과 높이를 나타내는 정수 H가 한 개의 빈 칸을 사이에 두고 주어진다.
L과 H는 둘 다 1 이상 1,000 이하이다.
첫 줄에 창고 다각형의 면적을 나타내는 정수를 출력한다.
내가 이 문제를 보고 생각해본 부분
입력 처리: BufferedReader와 StringTokenizer를 사용하여 기둥의 개수와 각 기둥의 위치 및 높이를 입력받는다.
기둥 클래스 정의: Pole 클래스를 정의하여 기둥의 위치와 높이를 저장한다.
기둥 정렬: 기둥의 위치를 기준으로 정렬한다.
가장 높은 기둥 찾기: 기둥 배열을 순회하여 가장 높은 기둥의 인덱스를 찾는다.
왼쪽 면적 계산: 왼쪽 기둥부터 가장 높은 기둥까지의 면적을 계산한다.
오른쪽 면적 계산: 오른쪽 기둥부터 가장 높은 기둥까지의 면적을 계산하고, 마지막으로 가장 높은 기둥의 높이를 추가한 후 결과를 출력한다.
코드로 구현
package baekjoon.baekjoon_27;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
// 백준 2304번 문제
public class Main961 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
Pole[] poles = new Pole[n];
// 입력받은 기둥의 위치와 높이 저장
for(int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine());
poles[i] = new Pole(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()));
}
// 기둥을 위치 기준으로 정렬
Arrays.sort(poles);
int totalArea = 0; // 창고 면적을 누적
int highestIndex = 0;
// 가장 높은 기둥 찾기
for(int i = 0; i < n; i++) {
if(poles[highestIndex].height < poles[i].height) {
highestIndex = i;
}
}
// 왼쪽에서 가장 높은 기둥까지 면적 계산
int leftIndex = 0;
for(int i = 0; i <= highestIndex; i++) {
if(poles[leftIndex].height <= poles[i].height) {
totalArea += (poles[i].position - poles[leftIndex].position) * poles[leftIndex].height;
leftIndex = i;
}
}
// 오른쪽에서 가장 높은 기둥까지 면적 계산
int rightIndex = n - 1;
for(int i = n - 1; i >= highestIndex; i--) {
if(poles[rightIndex].height <= poles[i].height) {
totalArea += (poles[rightIndex].position - poles[i].position) * poles[rightIndex].height;
rightIndex = i;
}
}
// 가장 높은 기둥의 높이 추가
totalArea += poles[highestIndex].height;
// 결과 출력
System.out.println(totalArea);
br.close();
}
// 기둥 클래스를 정의
public static class Pole implements Comparable<Pole> {
public int position; // 기둥의 위치
public int height; // 기둥의 높이
public Pole(int position, int height) {
this.position = position;
this.height = height;
}
// 위치 기준으로 정렬하기 위한 오버라이드
@Override
public int compareTo(Pole p) {
return this.position - p.position;
}
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.