세 개의 양수가 n, lower 및 upper라고 가정합니다. 길이가 n이고 엄격하게 증가하고 엄격하게 감소하고 모든 숫자가 [하한 및 상한] 범위(둘 다 포함)에 있는 목록을 찾아야 합니다. 그리고 각각의 증가 및 감소 부분은 비어 있지 않아야 합니다. 사전순으로 가능한 가장 큰 목록을 찾아야 합니다. 이것이 불가능하면 빈 목록을 반환합니다.
따라서 입력이 n =5 lower =3 upper =7과 같으면 출력은 [6, 7, 6, 5, 4]가 됩니다. 자세히 보면 [7, 6, 5, 4, 3 ]은(는) 엄격하게 증가하는 부분이 비어 있지 않아야 하므로 유효하지 않습니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
-
n> 2 * (상단 - 하단) + 1이면
-
빈 목록 반환
-
-
c :=위 - 아래
-
d :=1
-
c
-
d :=n - c - 1
-
-
d가 0과 같으면
-
d :=1
-
-
f :=(상단 - d)에서 (상단 - 1)까지의 새 목록
-
g :=범위(위쪽 - n + d - 1)에서 위쪽으로의 새 목록
-
f와 g를 연결하고 반환
예
더 나은 이해를 위해 다음 구현을 살펴보겠습니다.
def solve(n, lower, upper): if n > 2 * (upper - lower) + 1: return [] c = upper - lower d = 1 if c < n: d = n - c - 1 if d == 0: d = 1 f = list(range(upper - d, upper)) g = list(range(upper, upper - n + d, -1)) return f + g n = 5 lower = 3 upper = 7 print(solve(n, lower, upper))
입력
5, 3, 7
출력
[6, 7, 6, 5, 4]