본문으로 바로가기


1206. View

 문제는 1차원 배열의 문제로,

1차원 배열로 주어진 빌딩의 높이를 계산하여

왼쪽과 오른쪽 각각에 2 이상의 조망권을 확보한 세대 수를 반환해야 한다.

SW Expert Academy에서 푼 문제 리스트 보기

github에서 코드 보기

문제 조건

좌우로 2칸 이상의 공백이 존재하는 세대 수를 합해 반환한다.

가로는 1000이하로 주어진다.

각 빌딩의 높이는 최대 255이다.

맨 왼쪽 두 칸과 맨 오른쪽 두 칸에는 건물이 지어지지 않는다.

문제 풀이

문제를 이해하면 풀기가 쉽다. 건물이 지어지지 않은 맨 왼쪽 두 칸과 맨 오른쪽 두 칸을 제외하고 빌딩이 지어진 부분인 Index 2부터 i -2의 원소까지 순회한다. 

 i번째 원소의 왼쪽 2개의 원소와 오른쪽 2개의 원소 각각의 최대 값을 찾는다. i번째 원소와 값을 비교하여 하나라도 i번째원소보다 높으면 i+1번째로 이동해 다음 빌딩을 검사한다.

만약에 왼쪽, 오른쪽의 최대값보다 i번째의 원소의 값이 클 경우에는 i번째 원소의 값에서 왼쪽, 오른쪽 값 중 더 큰 값을 빼주도록 한다.

그렇게 해서 나온 값은 조망권이 확보된 세대이며, 모든 빌딩을 위와 같이 조사하였을 때 조망권이 확보된 모든 세대수를 구할 수 있다.

파이썬 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 
def solve(arr):
    count = 0
    for i in range(2len(arr) - 2):
        height = arr[i]
        left = max(arr[i-2:i])
        # 왼쪽 조망권 확인
        if height < left:
            continue
        right = max(arr[i+1:i+3])
        # 오른쪽 조망권 확인
        if height < right:
            continue
        around_height = max(left, right)
        count += (height - around_height)
    return count
 
 
if __name__ == "__main__":
    for i in range(10):
        c = int(input().strip())
        array = list(map(int, input().strip().split()))
        print("#{0} {1}".format(i+1, solve(array)))
 
cs

#SW Expert Academy #1206. View #1206 view #1206 View python #python 1206 #1206. View #파이썬 1206. View