Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 비트마스킹
- 트리
- 서비스 디스커버리
- 게이트웨이
- Logback
- 주울
- Spring Cloud Config
- 구현
- 구간 트리
- 다익스트라
- 도커
- ZuulFilter
- 유레카
- Java
- 달팽이
- 플로이드 와샬
- spring boot
- 이분 매칭
- dp
- 스프링 시큐리티
- 이분 탐색
- BFS
- 완전 탐색
- Gradle
- 백트래킹
- 스택
- Zuul
- 메모이제이션
- docker-compose
- spring cloud
Archives
- Today
- Total
Hello, Freakin world!
[백준 2304번][Java] 창고 다각형 본문
오랜만이라서 그런지 절대 쉽지 않았습니다...
꽤 오래 걸렸네요.
핵심은 기둥이 높아질 때마다 지붕 높이를 갱신하고 넓이를 추가해준다는 점.
그리고 동일한 방법을 정방향, 역방향으로 수행하면서 전체 넓이를 계산하는 겁니다.
처음에 한 방향으로만 풀려고하니 복잡도가 확 올라가 버리더군요.
그리고 주의할 점은 정방향으로 쭉 가서 계산하면서 마지막 가장 높은 기둥의 위치를 저장해두고
그 지점까지만 역방향 연산을 수행해야 계산 중복이 일어나지 않습니다.
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
// BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedReader br = new BufferedReader(new FileReader("testcase.txt"));
int N = Integer.parseInt(br.readLine());
List<Pillar> pillars = new ArrayList<>();
for (int i = 0; i < N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
int left = Integer.parseInt(st.nextToken());
int right = left+1;
int height = Integer.parseInt(st.nextToken());
pillars.add(new Pillar(left, right, height));
}
pillars.sort(Comparator.comparingInt(p -> p.left));
int area = 0;
int tallestPillarIndex = 0;
Pillar roofPillar = pillars.get(0);
//왼쪽에서 오른쪽으로
for (int i = 1; i < pillars.size(); i++) {
Pillar current = pillars.get(i);
if(roofPillar.height <= current.height) {
int width = current.left - roofPillar.left;
area += width * roofPillar.height;
roofPillar = current;
tallestPillarIndex = i;
}
}
//중간 점검
// System.out.println(area);
roofPillar = pillars.get(pillars.size()-1);
//오른쪽에서 왼쪽으로
for (int i = 1; i < pillars.size()-tallestPillarIndex; i++) {
Pillar current = pillars.get(pillars.size()-i-1);
if(roofPillar.height <= current.height) {
int width = roofPillar.right - current.right;
area += width * roofPillar.height;
roofPillar = current;
}
}
area += roofPillar.height;
System.out.println(area);
}
}
class Pillar {
int left,right;
int height;
public Pillar(int left, int right, int height) {
this.left = left;
this.right = right;
this.height = height;
}
@Override
public String toString() {
return "Pillar{" +
"left=" + left +
", right=" + right +
", height=" + height +
'}';
}
}
'알고리즘 > PS' 카테고리의 다른 글
[백준 1662번][Java] 압축 (0) | 2021.04.20 |
---|---|
[14719번][Java] 빗물 (0) | 2021.04.20 |
[백준 2573번][Java] 빙산 - 구현, 그래프 (0) | 2020.11.10 |
[백준 10757번][Java] 큰 수 A+B - 구현 (0) | 2020.11.07 |
[백준 16234번][Java] 인구 이동 - 그래프 탐색, 구현 (0) | 2020.10.31 |
Comments