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
- 이분 탐색
- Spring Cloud Config
- 백트래킹
- 비트마스킹
- docker-compose
- 메모이제이션
- Java
- spring cloud
- BFS
- spring boot
- 플로이드 와샬
- Gradle
- 스택
- 도커
- 달팽이
- 스프링 시큐리티
- 이분 매칭
- 서비스 디스커버리
- dp
- 트리
- Zuul
- 완전 탐색
- 구간 트리
- Logback
- 게이트웨이
- 다익스트라
- ZuulFilter
- 구현
- 주울
- 유레카
Archives
- Today
- Total
Hello, Freakin world!
[14719번][Java] 빗물 본문
14719번: 빗물
첫 번째 줄에는 2차원 세계의 세로 길이 H과 2차원 세계의 가로 길이 W가 주어진다. (1 ≤ H, W ≤ 500) 두 번째 줄에는 블록이 쌓인 높이를 의미하는 0이상 H이하의 정수가 2차원 세계의 맨 왼쪽 위치
www.acmicpc.net
해결 방법
물을 가두는데 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