728x90
시간 제한 1초, 메모리 제한 256MB
# 조건
- N명의 병사가 무작위로 나열되어 있다.
- 각 병사는 특정한 값의 전투력을 보유하고 있으며, 병사를 배치할 때는 전투력이 높은 병사가 앞쪽에 오도록 내림차순으로 배치를 하고자 한다.
- 다시 말해 앞쪽에 있는 병사의 전투력이 항상 뒤쪽에 있는 병사보다 높아야 한다.
- 또한 배치 과정에서는 특정한 위치에 있는 병사를 열외시키는 방법을 이용한다.
- 그러면서도 남아있는 병사의 수가 최대가 되도록 하고 싶다.
- 예를 들어, N=7일 때 나열된 병사들의 전투력이 다음과 같다고 가정하자.
- 이 때 3번 병사와 6번 병사를 열외시키면, 다음과 같이 남아있는 병사의 수가 내림차순의 형태가 되며 5명이 된다. 이는 남아있는 병사의 수가 최대가 되도록 하는 방법이다.
- 병사에 대한 정보가 주어졌을 때, 남아있는 병사의 수가 최대가 되도록 하기 위해서 열외해야 하는 병사의 수를 출력하는 프로그램을 작성하시오.
입력
- 첫째 줄에 N이 주어진다. (1 ≤ N ≤ 2,000)
- 둘째 줄에 각 병사의 전투력이 공백을 기준으로 구분되어 차례대로 주어진다.
- 각 병사의 전투력은 10,000,000보다 작거나 같은 자연수이다.
출력
- 첫째 줄에 남아있는 병사의 수가 최대가 되도록 하기 위해서 열외해야 하는 병사의 수를 출력한다.
# 접근 방법
- LIS 문제이다
- dp를 활용하여 풀어주면 쉽게 풀이가 가능하다.
- dp의 초기값은 1로 설정한 후, N-1번의 사람까지 확인할 건데 이 때, 자신보다 앞 번호의 사람들을 확인해준다.
- 이 때, 현재 값이 앞 번호의 사람(j)보다 작다면, dp값을 갱신해주면서 나아가면 된다.
import sys
sys.stdin = open('input.txt')
input = sys.stdin.readline
N = int(input())
nums = [*map(int, input().split())]
dp = [1] * N
for i in range(N):
for j in range(i):
if nums[i] < nums[j]:
dp[i] = max(dp[i], dp[j]+ 1)
print(N - max(dp))
728x90
'ALGORITHM > DP(동적 계획법)' 카테고리의 다른 글
[백준 2011번] 파이썬 - 암호 코드 (0) | 2023.11.25 |
---|---|
[백준 1890번] 파이썬 - 점프 (1) | 2023.10.28 |
[백준 22857번] 파이썬 - 가장 긴 짝수 연속한 부분 수열(small) (0) | 2023.09.26 |
[백준 14863번] 파이썬 - 서울에서 경산까지 (0) | 2023.09.22 |
[백준 4811번] 파이썬 - 알약 (0) | 2023.09.15 |