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 | 31 |
Tags
- 구간 트리
- 구현
- 트리
- Java
- 유레카
- Logback
- Gradle
- ZuulFilter
- 다익스트라
- dp
- 백트래킹
- Spring Cloud Config
- spring boot
- 서비스 디스커버리
- 이분 매칭
- 스프링 시큐리티
- 완전 탐색
- 달팽이
- 비트마스킹
- 게이트웨이
- 플로이드 와샬
- Zuul
- 주울
- BFS
- docker-compose
- spring cloud
- 이분 탐색
- 스택
- 도커
- 메모이제이션
Archives
- Today
- Total
Hello, Freakin world!
[14719번][Java] 빗물 본문
해결 방법
물을 가두는데 leftWall, rightWall가 필요하다고 합시다.
leftWall에 임의의 높이가 정해졌다고 할때, rightWall의 높이가 이보다 크거나 같을 경우에만 그 사이 담긴 물의 양을 계산합니다.
그리고 이걸 정방향, 역방향으로 둘다 해줍니다.
...
public class Main {
static int H,N;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// BufferedReader br = new BufferedReader(new FileReader("testcase.txt"));
StringTokenizer st = new StringTokenizer(br.readLine());
H = Integer.parseInt(st.nextToken());
N = Integer.parseInt(st.nextToken());
st = new StringTokenizer(br.readLine());
List<Integer> blocks = new ArrayList<>();
while(st.hasMoreTokens()) {
blocks.add(Integer.parseInt(st.nextToken()));
}
//정방향
Wall baseWall = new Wall(0, blocks.get(0));
int amount = 0;
for (int i = 1; i < blocks.size(); i++) {
Wall currentWall = new Wall(i, blocks.get(i));
if(baseWall.height <= currentWall.height) {
amount += calcRainAmount(baseWall, currentWall, blocks);
baseWall = currentWall;
}
}
// System.out.println(amount);
// System.out.println(baseWall.index);
//역방향
int tallestWallIndex = baseWall.index;
int lastIndex = blocks.size()-1;
baseWall = new Wall(lastIndex, blocks.get(lastIndex));
for (int i = 1; i < blocks.size()-tallestWallIndex; i++) {
Wall currentWall = new Wall(lastIndex-i, blocks.get(lastIndex-i));
if(baseWall.height <= currentWall.height) {
amount += calcRainAmount(currentWall, baseWall, blocks);
baseWall = currentWall;
}
}
System.out.println(amount);
}
private static int calcRainAmount(Wall leftWall, Wall rightWall, List<Integer> blocks) {
int amount = 0;
for (int i = leftWall.index+1; i < rightWall.index; i++) {
amount += Math.min(leftWall.height, rightWall.height) - blocks.get(i);
}
return amount;
}
}
class Wall {
int index, height;
public Wall(int index, int height) {
this.index = index;
this.height = height;
}
@Override
public String toString() {
return "Wall{" +
"index=" + index +
", height=" + height +
'}';
}
}
'알고리즘 > PS' 카테고리의 다른 글
[백준 15685번][Java] 드래곤 커브 (0) | 2021.04.21 |
---|---|
[백준 1662번][Java] 압축 (0) | 2021.04.20 |
[백준 2304번][Java] 창고 다각형 (0) | 2021.04.20 |
[백준 2573번][Java] 빙산 - 구현, 그래프 (0) | 2020.11.10 |
[백준 10757번][Java] 큰 수 A+B - 구현 (0) | 2020.11.07 |
Comments