문제
맨 처음에 1차원 배열로 풀려고 하다가,
굳이 그래야하나? 싶어서 2차원 배열로 푼 문제!
코드가 간단하게 나와서, 다른 코드 찾아보니까
문제 의도한 방향과 다르게 푼 것 같다 o(* ̄▽ ̄*)o
https://www.acmicpc.net/problem/14719
14719번: 빗물
첫 번째 줄에는 2차원 세계의 세로 길이 H과 2차원 세계의 가로 길이 W가 주어진다. (1 ≤ H, W ≤ 500) 두 번째 줄에는 블록이 쌓인 높이를 의미하는 0이상 H이하의 정수가 2차원 세계의 맨 왼쪽 위치
www.acmicpc.net
설계
알고리즘 설계 [접근 방법] : 구현
2차원 배열로 벽돌을 입력받은 후,
처음 행부터 반복문을 돌며 벽돌 사이에 있는 칸의 개수를 세주면 된다.
생각보다 간단하다.
그런데 2차원 배열로 입력받을 때 예시에 나온 그대로 입력을 받지 못하고 거꾸로 입력받았는데,
답은 제대로 나왔으니... 뭐 이런 방법도 있다! 정도로만 생각해도 될 듯!
코드
import java.util.Arrays;
import java.util.Scanner;
public class Test_14719_빗물 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int height = sc.nextInt(); //높이
int width = sc.nextInt(); //너비
//2차원 배열 생성
boolean[][] arr = new boolean[height][width];
//벽돌 입력받기
for(int i=0; i<width; i++) {
int rain = sc.nextInt();
for(int j=0; j<rain; j++) {
arr[j][i]=true; //벽돌인 부분 true
}
}
int rain=0; //최종 빗물의 양
for(int i=0; i<height; i++) {
int tmp=0; //임시 빗물의 양
boolean flag=false; //벽돌인지 확인
for(int j=0; j<width; j++) {
//그 전에 벽돌이 없었는데 지금 좌표가 벽돌일 때
if(arr[i][j] && !flag) flag=true;
//그 전에 벽돌이 있었는데 지금 벽돌이 아닐 때
else if(!arr[i][j] && flag) tmp++;
//그 전에 벽돌이 있었으면서 현재 좌표도 벽돌일 때
else if(arr[i][j] && flag) {
rain+=tmp; //총 빗물에 여태까지 모았던 빗물 더하고
tmp=0; //임시 빗물 초기화
}
}
}
//출력
System.out.println(rain);
}
}
'[자료구조] 알고리즘' 카테고리의 다른 글
[프로그래머스] k번째 수 (JAVA) (0) | 2023.07.07 |
---|---|
[프로그래머스] 카드 뭉치 (JAVA) (0) | 2023.07.06 |
[백준] 21610번_마법사 상어와 비바라기 (구현_JAVA) (0) | 2023.06.29 |
[백준] 1343번_폴리오미노 (그리디 알고리즘_JAVA) (0) | 2023.06.27 |
[백준] 11052번 카드 구매하기 (다이나믹 프로그래밍_JAVA) (2) | 2023.06.24 |