유형: 시뮬레이션
작성일시: 2022년 12월 9일 오전 11:47
2차원 세계에 블록이 쌓여있다. 비가 오면 블록 사이에 빗물이 고인다.
비는 충분히 많이 온다. 고이는 빗물의 총량은 얼마일까?
첫 번째 줄에는 2차원 세계의 세로 길이 H과 2차원 세계의 가로 길이 W가 주어진다. (1 ≤ H, W ≤ 500)
두 번째 줄에는 블록이 쌓인 높이를 의미하는 0이상 H이하의 정수가 2차원 세계의 맨 왼쪽 위치부터 차례대로 W개 주어진다.
2차원 세계에서는 한 칸의 용량은 1이다. 고이는 빗물의 총량을 출력하여라.
빗물이 전혀 고이지 않을 경우 0을 출력하여라.
예제 입력1 /출력 1
예제1
입력4 4 3 0 1 4
출력
5
예제2
입력4 8 3 1 2 3 4 1 1 2
출력
5
예제3
입력3 5 0 0 0 2 0
출력
0
이러한 문제 유형을 ‘구현’문제라고 한다.
📢 ‘구현(Implementation)’이란, 머리 속에 있는 알고리즘을 소스코드로 바꾸는 과정’을 의미한다.
구현하기 어려운 문제란?
⇒ 대체로 사소한 조건 설정이 많은 문제일수록 코드로 구현하기 까다롭다.
구현 문제를 풀기 위한 선행 조건
구현 문제에 접근하는 방법
출처 : [Algorithm] 구현 문제란?
# 입력
height, weight = map(int, input().split())
ground = list(map(int, input().split()))
rain = 0
# for문을 통해서 양 옆 비교하기
for i in range(1, weight-1):
left = max(ground[:i])
right = max(ground[i+1:])
std = min(left, right)
if ground[i] < std:
rain += std - ground[i]
# 값 출력
print(rain)
최종 답안은 맨 아래에 있습니다.
#세로 : height 가로 :weight
# 입력받기
weight, height = map(int, input().split())
ground = list(map(int, input().split()))
#양옆 비교
left = max(ground [:i])
right = max(ground [i+1:])
if ground[i] < left:
rain+= left - ground [i]
if ground[i] < right:
rain+= right - ground [i]
#값 출력
print(rain)
🚨이 코드의 문제점 : 이중으로 더해진다!
#세로 : height 가로 :weight
# 입력받기
weight, height = map(int, input().split())
ground = list(map(int, input().split()))
rain = 0
for i in range (1, weight) :
#양옆 비교
left = max(ground [:i])
right = max(ground [i+1:])
std = min(left, right)
if ground[i] < std:
rain+= std- ground [i]
NameError: name 'rain' is not defined
ValueError: max() arg is an empty sequence
Name error
→ rain을 0으로 초기화해줌Value error
→ 수치를 비교할 수 있는 데이터가 존재하지 않는 빈 리스트를 제공할 때 발생하는 에러이다. 리스트가 빈 리스트인지 확인하거나 len()
명령어를 통해 리스트 요소의 개수를 확인한 다음 작업을 수행하게 하면코드가 아무 문제없이 정상 작동하는 것을 확인할 수 있다.
⇒ 해결 : for문의 범위 설정이 잘못 되었음!
왜냐하면, 맨 왼쪽과 맨 오른쪽은 물이 고일 수 없기 때문에 그 부분은 제외하고 탐색해야 함
따라서 for i in range(1, weight-1)
로 변경!
weight, height = map(int, input().split())
ground = list(map(int, input().split()))
rain = 0
# for문을 통해서 양 옆 비교하기
for i in range(1, weight-1):
left = max(ground[:i])
right = max(ground[i+1:])
std = min(left, right)
if ground[i] < std:
rain += std - ground[i]
# 값 출력
print(rain)
🚨값이 제대로 안 나오고, 백준에서도 틀렸다고 나옴
⇒ 왜지?!
⇒ for범위에서 weight-1
은 맞다.근데 입력 받을 때 weight
, height
순으로 받았기 때문에 4, 8 에서 4가 들어가기 때문이다
# 입력 height, weight = map(int, input().split()) ground = list(map(int, input().split())) rain = 0 # for문을 통해서 양 옆 비교하기 for i in range(1, weight-1): left = max(ground[:i]) right = max(ground[i+1:]) std = min(left, right)> if ground[i] < std: rain += std - ground[i] # 값 출력 print(rain)