반응형
250x250
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
- 맥북
- 렌탈스튜디오창업
- jdk17
- fastapi
- 계정계
- Pass By Value
- 코딩테스트
- 은행IT
- 오라클
- 학점은행제
- 맥북셋팅
- 맥북환경설정
- 의사결정나무모형
- 학점은행제무료강의
- oracleapex
- 디렉토리계층구조
- jdk
- MSA
- 프로그래머스
- 개인프로필스튜디오창업
- 채널계
- 코어뱅킹
- DB
- SQL
- Homebrew
- 모놀리식
- it자격증
- union
- 컴퓨터공학학사취득
- python
Archives
- Today
- Total
개발머해니
[파이썬] 런던 폭우 Ⅱ 본문
728x90
반응형
실습 설명
런던에 엄청난 폭우가 쏟아진다고 가정합시다. 정말 재난 영화에서나 나올 법한 양의 비가 내려서, 고층 건물이 비에 잠길 정도입니다.
그렇게 되었을 때, 건물과 건물 사이에 얼마큼의 빗물이 담길 수 있는지 알고 싶은데요. 그것을 계산해 주는 함수 trapping_rain()을 작성해 보려고 합니다.
함수 trapping_rain()은 건물 높이 정보를 보관하는 리스트 buildings를 파라미터로 받고, 담기는 빗물의 총량을 리턴해 줍니다.
예를 들어서 파라미터 buildings로 [3, 0, 0, 2, 0, 4]가 들어왔다고 합시다. 그러면 0번 인덱스에 높이 3의 건물이, 3번 인덱스에 높이 2의 건물이, 5번 인덱스에 높이 4의 건물이 있다는 뜻입니다. 1번, 2번, 4번 인덱스에는 건물이 없습니다.
그러면 아래의 사진에 따라 총 10 만큼의 빗물이 담길 수 있습니다. 따라서 trapping_rain() 함수는 10을 리턴하는 거죠.
3차원 말고, 2차원으로 생각해 주세요!
이번에는 파라미터 buildings로 [0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1]가 들어왔다고 합시다. 그러면 아래의 사진에 따라 총 6 만큼의 빗물이 담길 수 있습니다. 따라서 trapping_rain() 함수는 6을 리턴하는 거죠.
- 리스트 [0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1]
이 정보를 기반으로, trapping_rain() 함수를 작성해 보세요!
더 많은 공간을 쓰더라도 조금 더 효율적인 시간 복잡도로 문제를 풀어 볼까요?
실습 결과
def trapping_rain(buildings):
total_height = 0 # 총 갇히는 비의 양을 담을 변수
n = len(buildings)
# 각각 왼쪽 오른쪽 최대값 리스트 정의
left_list = [0] * n
right_list = [0] * n
# buildings 리스트 각 인덱스 별로 왼쪽으로의 최댓값을 저장한다
left_list[0] = buildings[0]
for i in range(1, n):
left_list[i] = max(left_list[i-1], buildings[i-1])
# buildings 리스트 각 인덱스 별로 오른쪽으로의 최댓값을 저장한다
right_list[-1] = buildings[-1]
for i in range(n - 2, -1, -1):
right_list[i] = max(right_list[i+1], buildings[i+1])
# 저장한 값들을 이용해서 총 갇히는 비의 양을 계산한다
for i in range(1, n-1):
# 현재 인덱스에 빗물이 담길 수 있는 높이
upper_bound = min(right_list[i], left_list[i])
# 현재 인덱스에 담기는 빗물의 양을 계산
# 만약 upper_bound가 현재 인덱스 건물보다 높지 않다면, 현재 인덱스에 담기는 빗물은 0
total_height += max(0, upper_bound - buildings[i])
return total_height
print(trapping_rain([3, 0, 0, 2, 0, 4]))
print(trapping_rain([0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1]))
10
6
시간 복잡도
공간 복잡도
728x90
반응형
'알고리즘' 카테고리의 다른 글
[프로그래머스] 타겟넘버 (0) | 2024.01.05 |
---|---|
[파이썬] 괄호 짝 확인하기 (0) | 2023.12.15 |
[파이썬] 리스트 항목 합 탐색 (0) | 2023.09.30 |
[파이썬] 중복되는 항목 찾기 Ⅱ (0) | 2023.09.30 |
[파이썬] 출근하는 방법 Ⅱ (0) | 2023.09.30 |