본문 바로가기
코딩테스트 문제풀이/beakjoon

[백준] 18353 병사 배치하기

by merona99 2022. 6. 29.
반응형

백준 18353번 병사 배치하기

다이나믹 / 가장 긴 증가하는 부분 수열 O(nlogn)

 

 

 

[문제]

 

 

고려해야 할 부분은 항상 전투력이 높은 병사순으로 내림차순 이라는 것

배치 과정에서 특정한 위치에 있는 병사를 열외시켜서 남아있는 병사의 수가 최대가 되도록 하는 것

 

 

 

[과정]

 

'가장 긴 증가하는 부분 수열(LIS)'을 이용해서 풀이

내림차순을 요구하는 문제이기 때문에 점화식의 부등호 방향을 바꾸어주면 됨

 

  • dp는 모두 1로 초기화 하고 입력받은 병사들의 전투력을 저장
  • 점화식: 모든 0 <= j < i 에 대해, dp[i] = max(dp[i], dp[j]+1) if soldiers[j] > soldiers[i]
  • dp의 최댓값 -> 가장 긴 내림차순 부분 수열의 길이
  • 전체 병사의 수인 N에서 빼주기

 

 

 

[소스코드]

 

# 병사 배치하기

n = int(input())
data = list(map(int, input().split()))

result = []
dp = [1] * n
for i in range(n):
    for j in range(i):
        if data[j] > data[i]:
            dp[i] = max(dp[i], dp[j]+1)
print(n - max(dp))

 


 

 

[통과]

 

 

 

 

반응형

'코딩테스트 문제풀이 > beakjoon' 카테고리의 다른 글

[K대회] 정확한 순위  (0) 2022.06.30
[Google 인터뷰] 못생긴 수  (0) 2022.06.29
[백준] 14501 퇴사  (0) 2022.06.29
[백준] 11404 플로이드  (0) 2022.06.29
[백준] 1932 정수 삼각형  (0) 2022.06.21

댓글