연속된 블록들의 높이가 주어집니다. (ex. [1, 5, 5, 2, 6])
두 사람은 같은 블록에서 시작을 하고, 블록을 이동하여 최대한 멀리 떨어지려고 합니다.
이 때 블록의 이동은, 현재 블록보다 이동하려는 블록의 높이가 같거나 높은 곳으로 밖에 이동하지 못 합니다. (예를 들어서 1에서 시작하면 두 번째 5까지 밖에 가지 못함)
두 사람이 떨어질 수 있는 거리 중 최대의 거리를 구하세요.
enumerate(blocks)
를 (높이, 인덱스) 순으로 해서 정렬한 배열을 새로 만들었다. (왜냐하면 높이가 낮은 순부터 찾아야 점프할 수 있는 블록이 많아지기 때문)dist_left[i]
를 인덱스 i번째 블록에서 왼쪽으로 갈 수 있는 거리, dist_right[i]
를 인덱스 i번째 블록에서 오른쪽으로 갈 수 있는 거리라고 하자.dist_left
배열과 dist_right
배열은 손으로 써서 구하다 보면 O(N) 안에 구할 수 있음을 알 수 있다.dist_left[i]
와 dist_right[i]
를 더했을 때 그 값이 최대가 되는 조합이다.def solutions(blocks):
N = len(blocks)
dist_left = [0] * N
dist_right = [0] * N
#blocks[i]에서 왼쪽으로 갈 수 있는 칸의 수를 센다
for i in range(1, N):
dist_left[i] = dist_left[i-1] + 1 if blocks[i-1] >= blocks[i] else 0
#blocks[i]에서 오른쪽으로 갈 수 있는 칸의 수를 센다
for i in range(N-2, 0, -1):
dist_right[i] = dist_right[i+1] + 1 if blocks[i+1] >= blocks[i] else 0
maxDist = 0
for i in range(N):
if dist_left[i] + dist_right[i] >= maxDist:
maxDist = dist_left[i] + dist_right[i]
return maxDist + 1