알고리즘 문제풀이/백준

[백준 1027] 고층 건물

taemin 2021. 5. 12.

www.acmicpc.net/problem/1027

 

1027번: 고층 건물

세준시에는 고층 빌딩이 많다. 세준시의 서민 김지민은 가장 많은 고층 빌딩이 보이는 고층 빌딩을 찾으려고 한다. 빌딩은 총 N개가 있는데, 빌딩은 선분으로 나타낸다. i번째 빌딩 (1부터 시작)

www.acmicpc.net

N = int(input())
bd= list(map(int,input().split()))

def left_view(i):
    line = 10000000000
    view = 0
    cur_idx = i-1
    while cur_idx >= 0:
        dx = i-cur_idx
        dy = bd[i] - bd[cur_idx]
        dydx = dy/dx

        if dydx < line:
            view+=1
            line = dydx
        cur_idx-=1
    return view

def right_view(i):
    line = -10000000000
    view = 0
    cur_idx = i+1
    while cur_idx < N:
        dx = cur_idx-i
        dy = bd[cur_idx] - bd[i]
        dydx = dy/dx

        if dydx > line:
            view+=1
            line = dydx
        cur_idx+=1
    return view

idx = 0
max_view = 0
for i in range(N):
    l = left_view(i)
    r = right_view(i)
    # print("=======")
    # print("빌딩 인덱스 :",i)
    # print("빌딩 왼쪽 :",l)
    # print("빌딩 오른쪽 :",r)
    total = l+r
    if max_view < total:
        max_view = total
        idx = i

print(max_view)

풀이

처음엔 스택인가 했다. 이런류의 스택문제가 많기 때문에 그렇게 생각했다. 하지만 N이 작고 이중포문으로 체크하면 끝날 하나씩 다 체크해도 시간이 충분할 것 같았기 때문에 생각을 멈추고 아래와 같이 구현했다.

 

각각 빌딩에서 볼 수 있는 최대 빌딩의 수를 구한다.

빌딩 수가 50 이하이므로 이중포문을 돌려도 충분하다.

 

1. 빌딩에서 왼쪽을 볼때

- 빌딩 바로 왼쪽부터 왼쪽 끝까지 진행

기울기가 지속적으로 감소해야 한다.

- 최대로 작았던 기울기르 저장해놓고 그것보다 작은 기울기가 나왔을 때만 값을 추가한다.

 

2. 빌딩에서 오른쪽을 볼때

- 빌딩 바로 오른쪽부터 오른쪽 끝까지 진행

기울기가 지속적으로 증가해야 한다.

- 최대로 큰 기울기를 저장해놓고 그것보다 큰 기울기가 나왔을 때만 값을 추가한다.

 

시간복잡도

N개의 빌딩이 존재하고, 빌딩마다 전체 N개의 빌딩을 탐색하기 때문에 O(N^2) 이다.

'알고리즘 문제풀이 > 백준' 카테고리의 다른 글

[백준 18405] 경쟁적 전염  (0) 2021.05.12
[백준 1034] 램프  (0) 2021.05.12
[백준 1004] 어린왕자  (0) 2021.05.12
[백준 15954] 인형들  (0) 2021.05.11
[백준 1188] 음식 평론가  (0) 2021.05.11

댓글