(1).백준 14719번 빗물은 특정 블록들의 높이를 제공했을 때
비가 내리면 빗물이 고인 양을 출력해야 하는 문제였다.
이걸 어떻게 계산할 수 있을까 생각하다가 간단하게 각 라인별로 순회하면서 빗물을 찾기로 했고
이중배열 형태로 주어진 것이 아니라서 바닥부터 해당 높이에 있는 제일 왼쪽, 오른쪽 블럭을 먼저 찾아주기로 했다.
indexOf, lastIndexOf를 사용하면 편했겠지만 이중배열이 아니라 사용할 수 없었고
getFirst, getLast 메서드를 따로 만들어서 for문으로 순회해서 찾아줬고
maxHeight를 통해서 굳이 블럭이 하나도 없는 높이까지는 확인하지 않는 방식으로 진행했다.
처음에는 메서드들에서 찾지 못할 경우를 대비한 return값을 고민했었는데
막상 로그에 찍히지 않아서 곰곰이 생각해보니 애초에 maxHeight로 최대 높이까지만 구하기 때문에
first, last가 동일한 경우가 생길 수는 있지만 없는 경우는 없어서 찾을 수 없는 경우의 return은 다시 제외했다.
아래와 같은 엉성한 ㅁ으로 표현하자면 3, 1, 2, 0, 2 형태의 높이고
제일 바닥부터 확인하면 firstIndex는 0, lastIndex는 4가 되며
그 중 현재 순회 조건 높이인 1보다 작은 값은 index3일 때 뿐이라 1이 증가하고
그 다음 순회의 경우에도 0, 4 범위(1~3)을 순회하며 index1, index3에서 각각 1이 증가해서
여기서 받을 수 있는 빗물은 총 3이 되는 방식으로 해결했다.
ㅁ
ㅁ ㅁ ㅁ
ㅁ ㅁ ㅁ ㅁ
const input = `4 4
3 0 1 4`.split('\n')[1].split(' ').map(Number)
const maxHeight = Math.max(...input)
let rain = 0
const getFirst = (height) => {
for(let i = 0 ; i < input.length ; i ++){
if(height <= input[i]){
return i
}
}
}
const getLast = (height) => {
for(let i = input.length - 1 ; i >= 0 ; i --){
if(height <= input[i]){
return i
}
}
}
for(let i = 1 ; i <= maxHeight ; i++){
const firstIndex = getFirst(i)
const lastIndex = getLast(i)
for(let j = firstIndex + 1 ; j < lastIndex ; j++){
if(input[j] < i){
rain++
}
}
}
console.log(rain)
'회고' 카테고리의 다른 글
[개발일지] - 495(주말) (0) | 2024.11.09 |
---|---|
[개발일지] - 494 (1) | 2024.11.08 |
[개발일지] - 492 (1) | 2024.11.06 |
[개발일지] - 491 (1) | 2024.11.05 |
[개발일지] - 490 (0) | 2024.11.04 |