https://www.acmicpc.net/problem/14719
14719번: 빗물
첫 번째 줄에는 2차원 세계의 세로 길이 H과 2차원 세계의 가로 길이 W가 주어진다. (1 ≤ H, W ≤ 500) 두 번째 줄에는 블록이 쌓인 높이를 의미하는 0이상 H이하의 정수가 2차원 세계의 맨 왼쪽 위치
www.acmicpc.net
코드설명
구현과 시뮬레이션을 활용하는 문제입니다.
문제로직입니다.
- 맨 첫번쨰 공간, 맨 마지막 공간에는 물이 고일 수 없습니다. (첫번째 공간에는 왼쪽벽이 없고, 마지막 공간에는 오른쪽벽이 없음)
- 각 공간마다의 높이를 구해나갑니다. 이 문제에서 가장 중요한 점은, 왼쪽의 최대벽 높이와, 오른쪽의 최대벽 높이를 각각의 벽마다 구한뒤, 왼쪽의 최대벽 높이와 오른쪽의 최대벽 높이의 최소값을 더해주면 해당 벽에 고일 수 있는 물의 양이 구해집니다.
코드에 자세한 주석을 정리해보았습니다.
코드
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.*; public class Main { public static int H, W; public static int[] arr; public static int answer = 0; public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); H = Integer.parseInt(st.nextToken()); W = Integer.parseInt(st.nextToken()); arr = new int[W]; st = new StringTokenizer(br.readLine()); for(int i=0;i<W;i++) { arr[i] = Integer.parseInt(st.nextToken()); } for(int i=1; i<W-1; i++) { //맨 첫번째 공간, 맨 마지막 공간에는 각각 왼쪽과 오른쪽에 벽을 세울수 없으므로 물을 채울 수 없습니다. int currentHeight = arr[i]; int leftMaxHeight = currentHeight; int rightMaxHeight = currentHeight; for(int k=i-1; k>=0;k--) { //왼쪽 최대벽 높이를 탐색합니다. if(leftMaxHeight < arr[k]) { leftMaxHeight = arr[k]; } } for(int k=i+1; k < W; k++) { //오른쪽 최대벽 높이를 탐색합니다. if(arr[k] > rightMaxHeight) { rightMaxHeight = arr[k]; } } int shorterHeight = Math.min(leftMaxHeight, rightMaxHeight); // 왼쪽 최대높이와 오른쪽 최대높이 중 더 짧은 높이로 물이채워집니다. if(shorterHeight > currentHeight) { //만약 현재 벽보다 양옆의 벽중 하나라도 더 작다면, 계싼하지 않음. 둘다 커야만 물이 차기에 계산처리 answer += shorterHeight - currentHeight; } } System.out.println(answer); } }
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 7490 0 만들기 - 완전탐색 + 문자열 + stringtokenizer JAVA (0) | 2023.08.11 |
---|---|
[백준] 2138 전구와 스위치 - 그리디 + 아이디어 JAVA (0) | 2023.08.11 |
[백준] 2493 탑 - 자료구조 Stack(스택) JAVA (0) | 2023.08.10 |
[백준] 20055 컨베이어 벨트 위의 로봇 - 구현 + 시뮬레이션 JAVA (0) | 2023.08.10 |
[백준] 17615 볼 모으기 - 구현 + 그리디 JAVA (0) | 2023.08.09 |