[백준] 1965번 상자넣기

seovalue·2020년 8월 4일
0

알고리즘

목록 보기
29/39
post-thumbnail

🐳 링크

백준 1965번 상자넣기

🐕 문제

정육면체 모양의 상자가 일렬로 늘어서 있다. 상자마다 크기가 주어져 있는데, 앞에 있는 상자의 크기가 뒤에 있는 상자의 크기보다 작으면, 앞에 있는 상자를 뒤에 있는 상자 안에 넣을 수가 있다. 예를 들어 앞에서부터 순서대로 크기가 (1, 5, 2, 3, 7)인 5개의 상자가 있다면, 크기 1인 상자를 크기 5인 상자에 넣고, 다시 이 상자를 크기 7인 상자 안에 넣을 수 있다. 하지만 이렇게 상자를 넣을 수 있는 방법은 여러 가지가 있을 수 있다. 앞의 예에서 차례대로 크기가 1, 2, 3, 7인 상자를 선택하면 총 4개의 상자가 한 개의 상자에 들어가게 된다.

상자의 크기가 주어질 때, 한 번에 넣을 수 있는 최대의 상자 개수를 출력하는 프로그램을 작성하시오.

🐾 풀이 방법

n 길이의 0으로 초기화된 dp라는 배열을 생성한다.
box[i] (0<=i<n) 값의 앞에 자신보다 작은 값이 존재한다면, 그 값들의 dp값들 중 가장 큰 maxVal에 자신을 추가하여 (+1) 해당 값을 dp[box[i]]에 저장한다.

즉, (1,5,2,3,7)의 예를 들어보자면

  • 0번째 값(1)의 경우에는 자신이 맨 처음이므로 무조건 dp[0]은 0을 갖게 된다.
  • 1번째 값(5)의 경우에는 앞에 자신(5)보다 작은 값(1)이 있으므로, 1의 dp값인 1에 자신을 나타내는 1을 더하여 총 2를 dp[1]에 저장한다.
  • 2번째 값(2)의 경우에는 앞에 자신(2)보다 작은 값(1)이 있으므로, 1의 dp값 + 1을 하여 2를 dp[2]에 저장한다.
  • 3번째 값(3)의 경우에는 앞에 자신(3)보다 작은 값인 (1,2)가 존재하므로, (1,2)의 dp값들 중 더 큰 값인 2의 dp값인 2에 +1을 하여 3을 dp[3]에 저장한다.
  • 4번째 값(7)의 경우에는 앞에 자신(7)보다 작은 값이 (1,2,3)이 존재하므로, (1,2,3)의 dp값들 중 가장 큰 값인 3의 dp값 3에 +1을 하여 4를 dp[4]에 저장한다.

최종적으로 가장 큰 값을 print해야하므로, max(dp)를 출력한다. #출력: 4

모든 테스트케이스 성공 코드

import sys
sys.stdin = open("input.txt","rt")

n = int(input())
box = list(map(int,input().split()))
dp = [0 for _ in range(n)]
dp[0] = 1

for i in range(1,n):
    maxVal = 0
    for j in range(0,i):
        if box[j] < box[i]:
            maxVal = dp[j] if dp[j] > maxVal else maxVal
    dp[i] = maxVal+1
print(max(dp))
profile
도전을 좋아하고 호기심이 많아 시작하는 것을 좋아합니다 :-)

0개의 댓글