[ BOJ / Python ] 1965번 상자넣기

황승환·2022년 1월 24일
0

Python

목록 보기
121/498


다이나믹 프로그래밍 연습을 위해서 다이나믹 프로그래밍 문제를 더 풀어보았다. 이번에는 이전 수들 중에서 자신보다 작은 수에 대한 dp값을 비교하여 더 큰 값으로 갱신하는 방식으로 해결하였다. 1, 5, 2, 3, 7로 예를 들어보면 다음과 같다.

  • dp배열을 1로 초기화한다.
  • 1 이전에 작은 상자가 없으므로 dp[0]은 1로 유지한다.
  • 5 이전에 1이 있으므로 dp[1]은 2로 갱신한다.
  • 2 이전에 1이 있으므로 dp[2]는 2로 갱신한다.
  • 3 이전에 1이 있으므로 dp[3]은 2로 갱신한다.
    -> 2가 있으므로 dp[3]은 3으로 갱신한다.
  • 7 이전에 1이 있으므로 dp[4]는 1로 갱신한다.
    -> 5가 있으므로 dp[4]는 3으로 갱신한다.
    -> 2가 있으므로 dp[4]는 3으로 유지한다.
    -> 3이 있으므로 dp[4]는 4로 갱신한다.
  • dp중 가장 큰 수인 4가 도출된다.

코드는 다음과 같이 작성하였다.

  • n을 입력받는다.
  • 상자의 크기를 나타내는 배열 box를 입력받는다.
  • dp배열을 1 n개로 초기화한다.
  • n만큼 반복하는 i에 대한 for문을 돌린다.
    -> i만큼 반복하는 j에 대한 for문을 돌린다.
    --> box[j]보다 box[i]가 더 클 경우 dp[i]를 dp[i]와 dp[j]+1 중 더 큰 값으로 갱신한다.
  • dp중 가장 큰 값을 출력한다.

Code

n=int(input())
box=list(map(int, input().split()))
dp=[1]*n
for i in range(n):
    for j in range(i):
        if box[j]<box[i]:
            dp[i]=max(dp[i], dp[j]+1)
print(max(dp))

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

0개의 댓글