📖 문제
https://www.acmicpc.net/problem/2304
💡 풀이 방식
• 브루트포스
가장 높은 길이를 기준으로 왼쪽 부분과 오른쪽 부분으로 나눠 지붕을 메꾼다.
1. 기둥들의 위치와 높이를 입력받는다.
2. 입력받은 기둥들의 정보를 위치 기준 오름차순 정렬한다.
3. 가장 높은 기둥의 길이를 기준으로 왼쪽 부분에서 기둥이 커지는 구간의 면적만 계산한다. (맨 왼쪽 0부터 pivot까지)
4. 가장 높은 기둥의 길이를 기준으로 오른쪽 부분에서 기둥이 작아지는 구간의 면적만 계산한다. (맨 오른쪽부터 pivot까지)
5. 제일 큰 기둥의 높이를 더한다.
🔺 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
import java.util.*;
import java.io.*;
public class Main {
static int N, sum;
static List<Info> list = new ArrayList<>();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
N = Integer.parseInt(br.readLine());
for(int i = 0 ; i < N ; i++) {
st = new StringTokenizer(br.readLine(), " ");
int L = Integer.parseInt(st.nextToken());
int H = Integer.parseInt(st.nextToken());
list.add(new Info(L, H));
}
// 위치 기준 오름차순 정렬
Collections.sort(list, (o1, o2) -> o1.x - o2.x);
sum = 0; // 창고 면적 누적 저장
int pivot = 0; // 가장 높은 기둥 높이
// 1. 왼쪽 부분 계산 : [0, pivot]
Info highC = list.get(0); // 맨 왼쪽 끝 기둥
for(int i = 1 ; i < list.size() ; i++) {
Info curC = list.get(i);
if(highC.high <= curC.high) { // 더 높은 기둥을 만나면
sum += (curC.x - highC.x) * highC.high;
highC = curC;
pivot = i; // 가장 높은 기둥을 pivot으로
}
}
// 2. 오른쪽 부분 계산 : [pivot, N-1]
highC = list.get(list.size() - 1); // 맨 오른쪽 끝 기둥
for(int i = 1 ; i < list.size() - pivot ; i++) {
Info curC = list.get(list.size() - 1 - i);
if(highC.high <= curC.high) {
sum += (highC.x - curC.x) * highC.high;
highC = curC;
}
}
// 3. pivot 기둥 넓이 더하기
sum += list.get(pivot).high;
System.out.println(sum);
}
}
class Info {
int x, C; // x좌표, 높이
public Info(int x, int C) {
this.x = x;
this.C = C;
}
}
|
cs |
➕ 다른 풀이 방식
- 스택을 활용한 풀이!!
[Algorithm] 백준 2304번_창고 다각형(Java)
2304번 창고 다각형 https://www.acmicpc.net/problem/2304 문제 N 개의 막대 기둥이 일렬로 세워져 있다. 기둥들의 폭은 모두 1 m이며 높이는 다를 수 있다. 이 기둥들을 이용하여 양철로 된 창고를 제작하려
myeongju00.tistory.com
- 객체 배열 활용한 풀이! 그리고 설명도 굿!!
[백준 / JAVA] 2304번 창고 다각형
문제 > https://www.acmicpc.net/problem/2304 접근 먼저 기둥 입력이 위치 순으로 이루어지지 않음. 위치, 높이를 입력할 수 있는 기둥 클래스를 만들고 배열로 선언. 값을 입력 받은 후 위치 오름차순으로
velog.io
💦 어려웠던 점
- 한 방향으로만 이동하며 계산할 생각을 했었다...
- 뭔가 빗물 문제가 생각났다.
🧐 새로 알게 된 내용
- 가장 높은 높이 pivot을 기준으로 왼쪽 부분과 오른쪽 부분으로 나눠 계산하는 아이디어
1회독 | 2회독 | 3회독 | 4회독 | 5회독 |
V |
(참고)
[백준 2304] - 창고 다각형(JAVA)
[문제] https://www.acmicpc.net/problem/2304 2304번: 창고 다각형 첫 줄에는 기둥의 개수를 나타내는 정수 N이 주어진다. N은 1 이상 1,000 이하이다. 그 다음 N 개의 줄에는 각 줄에 각 기둥의 왼쪽 면의 위치
dding9code.tistory.com
'코테 > 백준' 카테고리의 다른 글
[백준/JAVA] 2493번: 탑 (0) | 2024.07.05 |
---|---|
[백준/JAVA] 12919번: A와 B 2 (0) | 2024.06.24 |
[백준/JAVA] 1958번: LCS 3 (0) | 2024.06.22 |
[백준/JAVA] 20364번: 부동산 다툼 (0) | 2024.06.22 |
[백준/JAVA] 16960번: 스위치와 램프 (0) | 2024.06.20 |