Algorithm/Dynamic Programming

[Python] 병사 배치하기

코딩쪼앙 2023. 2. 8. 15:00

문제

 

18353번: 병사 배치하기

첫째 줄에 N이 주어진다. (1 ≤ N ≤ 2,000) 둘째 줄에 각 병사의 전투력이 공백을 기준으로 구분되어 차례대로 주어진다. 각 병사의 전투력은 10,000,000보다 작거나 같은 자연수이다.

www.acmicpc.net

입력

  • 첫째 줄에 N이 주어진다. (1 ≤ N ≤ 2,000) 둘째 줄에 각 병사의 전투력이 공백을 기준으로 구분되어 차례대로 주어진다. 각 병사의 전투력은 10,000,000보다 작거나 같은 자연수이다.

출력

  • 첫째 줄에 남아있는 병사의 수가 최대가 되도록 하기 위해서 열외해야 하는 병사의 수를 출력한다.

 

입력 예시

7
15 11 4 8 5 2 4

출력 예시

2

문제 풀이

  • 가장 긴 증가하는 부분 수열 구하는 전형적인 다이나믹 프로그래밍 문제
  • 증가하는 부분 수열이란 하나의 수열이 주어졌을 때 값들이 증가하는 형태의 가장 긴 부분수열을 찾는 것
  • 내림차순으로 주어진 배열을 뒤집어서 증가하는 부분 수열 구하면 답을 도출해낼 수 있다.
  • 점화식은 아래와 같다.
# 0 <= j < i일 때
if dp[j] < dp[i] dp[i] = max(dp[i], dp[j] + 1)

코드

n = int(input())
array = list(map(int,input().split()))
# dp테이블 값 1로 초기화
dp = [1] * n
# array 뒤집어서 증가하는 부분수열 값 구하기
array.reverse()

# i,j 증가시켜 가며, 증가하는 부분수열의 최댓값 구하기
for i in range(1, n):
    for j in range(0, i):
        if array[j] < array[i]:
            dp[i] = max(dp[i], dp[j] + 1)
            
# 열외 시켜야하는 최소 병사 수 출력
print(n - max(dp))

'Algorithm > Dynamic Programming' 카테고리의 다른 글

[Python] 퇴사  (0) 2023.02.08
[Python] 못생긴 수  (0) 2023.02.08
[Python] 효율적인 화폐 구성  (0) 2023.02.08
[Python] 바닥공사  (0) 2023.02.08
[Python] 정수 삼각형  (0) 2023.02.06