강변에 빌딩들이 옆으로 빽빽하게 밀집한 지역이 있다.
이곳에서는 빌딩들이 너무 좌우로 밀집하여, 강에 대한 조망은 모든 세대에서 좋지만 왼쪽 또는 오른쪽 창문을 열었을 때 바로 앞에 옆 건물이 보이는 경우가 허다하였다.
그래서 이 지역에서는 왼쪽과 오른쪽으로 창문을 열었을 때, 양쪽 모두 거리 2 이상의 공간이 확보될 때 조망권이 확보된다고 말한다.
빌딩들에 대한 정보가 주어질 때, 조망권이 확보된 세대의 수를 반환하는 프로그램을 작성하시오.
아래와 같이 강변에 8채의 빌딩이 있을 때, 연두색으로 색칠된 여섯 세대에서는 좌우로 2칸 이상의 공백이 존재하므로 조망권이 확보된다. 따라서 답은 6이 된다.

A와 B로 표시된 세대의 경우는 왼쪽 조망은 2칸 이상 확보가 되었지만 오른쪽 조망은 한 칸 밖에 확보가 되지 않으므로 조망권을 확보하지 못하였다.
C의 경우는 반대로 오른쪽 조망은 2칸이 확보가 되었지만 왼쪽 조망이 한 칸 밖에 확보되지 않았다.
[제약 사항]
가로 길이는 항상 1000이하로 주어진다.
맨 왼쪽 두 칸과 맨 오른쪽 두 칸에는 건물이 지어지지 않는다. (예시에서 빨간색 땅 부분)
각 빌딩의 높이는 최대 255이다.
[입력]
총 10개의 테스트케이스가 주어진다.
각 테스트케이스의 첫 번째 줄에는 건물의 개수 N이 주어진다. (4 ≤ N ≤ 1000)
그 다음 줄에는 N개의 건물의 높이가 주어진다. (0 ≤ 각 건물의 높이 ≤ 255)
맨 왼쪽 두 칸과 맨 오른쪽 두 칸에 있는 건물은 항상 높이가 0이다. (예시에서 빨간색 땅 부분)
[출력]
#부호와 함께 테스트케이스의 번호를 출력하고, 공백 문자 후 조망권이 확보된 세대의 수를 출력한다.
문제 이해
- 여러 건물 중에서 조망권을 갖고 있는 세대 수를 출력하는 문제입니다. 조망권의 정의는 좌우로 2칸 이상 간격이 있으면 조망 가능하다고 합니다.
- 완전탐색으로 해결했습니다. 입력 건물 수가 최대 1000이므로 n^3(3중 루프문)까지는 가능하다고 판단했습니다.
- 어떤 건물 i를 봤을 때 좌우로 2칸씩을 살피면 되므로, 한번 탐색할 때 5칸을 탐색합니다. 이를 위해 가장 앞/뒤에 위치한 두 개의 건물은 i 반복문에서 제외시킵니다.(문제에서도 0 0 으로 제시해서 힌트를 줬습니다.)
- 살펴보는 5칸의 건물 중에서 가장 높은 건물이 i번째 건물(반복문의 현재idx)이라면, 현재 건물을 제외한 나머지 4개의 건물 중 가장 높은 값을 구해서 현재 건물의 높이에서 빼줍니다. 이렇게 되면 조망 가능한 세대(칸 안에서 두번째 높은 건물보다 윗층인 세대)를 구할 수 있습니다.
코드
#SWEA 1206 View
# 건물의 길이 항상 1000이하 -> 3중 루프까진 가능
# i-2~i+2를 기준으로 완전탐색
# i에서 i-2, i-1, i+1, i+2를 뺀 값의 최솟값 = 그 건물의 조망 확보 세대수
for test_case in range(1, 11):
n = int(input())
answer = 0
arr = list(map(int, input().split()))
for i in range(2, n-2):
if max(arr[i-2], arr[i-1], arr[i], arr[i+1], arr[i+2]) == arr[i]:
answer += arr[i] - max([arr[i-2], arr[i-1], arr[i+1], arr[i+2]])
print(f"#{test_case}", answer)
'알고리즘 풀이 > Python' 카테고리의 다른 글
[Python] 동전 게임 (백준 9079번 파이썬) (0) | 2023.10.13 |
---|---|
[Python] 단어 변환 (프로그래머스 Lv3 파이썬) (0) | 2023.10.12 |
[Python] 스도쿠 검증 (SWEA 1974번 파이썬) (1) | 2023.10.11 |
[Python] 최솟값 만들기 (프로그래머스 Lv2 파이썬) (1) | 2023.10.03 |
[Python] 지름길 (백준 1446번 파이썬) (0) | 2023.09.29 |