[Python] 백준 2491

https://www.acmicpc.net/problem/2491


문제

0에서 9까지 N개의 숫자 시퀀스가 ​​있습니다. 연속적으로 증가(동일 포함)하거나 연속 감소(동등 포함)하는 가장 긴 시퀀스를 찾아 길이를 인쇄하는 프로그램을 작성하십시오.

예를 들어 수열 1, 2, 2, 4, 4, 5, 7, 7, 2, 1 ≤ 2 ≤ 2 ≤ 4 ≤ 4 ≤ 5 ≤ 7 ≤ 7이 가장 긴 구간이므로 길이는 8이다. . 시퀀스 4, 1, 3, 3, 2, 2, 9, 2, 3, 3 ≥ 3 ≥ 2 ≥ 2가 가장 긴 세그먼트이므로 길이 4가 반환됩니다. 또한 1, 5, 3, 6, 4, 7, 1, 3, 2, 9, 5의 경우 순차 증가 또는 감소하는 수열의 길이가 3보다 크거나 같은 경우가 없기 때문에 , 2는 출력되어야 합니다.

기입

시퀀스 N의 길이는 첫 번째 줄에 주어지고 N개의 숫자는 그 사이에 공백을 두고 두 번째 줄에 주어집니다. N은 1 이상 100,000 이하의 정수이다.

누르다

첫 줄에 가장 긴 길이를 인쇄합니다.


문제에서 주문 n번째 해당 값이 n+1번째 값보다 작거나 같은 경우(n <= n+1), 또는 n번째 값이 n+1번째 값보다 크거나 같은 경우(n >= n+1)게다가 연속 간격라고 고려된다

목록의 항목 값을 기준으로 계속 증가하는 구간과 감소하는 구간의 값을 비교하여 더 큰 값을 출력하면 문제를 해결할 수 있습니다.

입력값 n개만큼 1씩 리스트 dp1, dp2를 생성한 후 연속구간 조건이 맞을 때마다 1씩 더하는 방식이다.

dp1과 dp2에서 가장 큰 값을 가진 요소를 max로 추출한 다음 max로 두 값을 다시 비교합니다.

코드

import sys

n = int(sys.stdin.readline())
ary = list(map(int, input().split()))
dp1, dp2 = (1 for i in range(n)), (1 for i in range(n))

# increase
for i in range(n-1):
    if ary(i) <= ary(i+1):
        dp1(i+1) += dp1(i)

# decrease
for j in range(n-1):
    if ary(j) >= ary(j+1):
        dp2(j+1) += dp2(j)

max1, max2 = max(dp1), max(dp2)
print(max(max1, max2))