[ BOJ / Python ] 2491번 수열

황승환·2022년 1월 26일
0

Python

목록 보기
126/498


이번 문제는 다이나믹 프로그래밍을 통해 해결하였다. 이전의 값과 비교하여 dp를 갱신하며 그 중 최대값을 찾아 출력하였다. 처음에 문제를 제대로 읽지 않아서 앞<=뒤, 앞>=뒤 의 경우에 대한 dp를 모두 구현하지 않고 앞<=뒤에 대한 dp만 구현해서 오답 처리 당했다. 이 문제에 대한 점화식은 다음과 같다.
dp[n]=max(dp[n], dp[n-1]+1)
<=의 경우와 >=의 경우를 모두 구해야 하기 때문에 dp배열을 2차원으로 선언하고 dp[i][0]은 <=의 경우를, dp[i][1]은 >=의 경우를 저장하였다.

  • n을 입력받는다.
  • arr을 입력받는다.
  • dp배열을 2차원으로 선언하고 1을 n개씩 채운다.
  • 1부터 n-1까지 반복하는 i에 대한 for문을 돌린다.
    -> 만약 arr[i]가 arr[i-1]보다 크거나 같다면 dp[0][i]를 dp[0][i]와 dp[0][i-1]+1 중 더 큰 값으로 갱신한다.
    -> 만약 arr[i]가 arr[i-1]보다 작거나 같다면 dp[1][i]를 dp[1][i]와 dp[1][i-1]+1 중 더 큰 값으로 갱신한다.
  • dp[0]의 최대값과 dp[1]의 최대값 중 더 큰 값을 출력한다.

Code

n=int(input())
arr=list(map(int, input().split()))
dp=[[1]*n for _ in range(2)]
for i in range(1,n):
    if arr[i]>=arr[i-1]:
        dp[0][i]=max(dp[0][i], dp[0][i-1]+1)
    if arr[i]<=arr[i-1]:
        dp[1][i]=max(dp[1][i], dp[1][i-1]+1)
print(max(max(dp[0]), max(dp[1])))

profile
꾸준함을 꿈꾸는 SW 전공 학부생의 개발 일기

0개의 댓글