[BaekJoon] 18353번 : 병사 배치하기

Updated:

18353번 : 병사 배치하기


우선 결론만 말하자면 [BaekJoon] 백준 11053번 : 가장 긴 증가하는 부분 수열 과 똑같은 문제이다.

가장 긴 감소하는 부분 수열 길이를 구한 뒤 전체 길이에서 빼주면 된다.

그런데.. 이 생각을 도저히 하지 못했다.

열외해야 하는 병사의 수를 구하는 것에 집중하는 바람에 반대로 구하는 방법을 생각하지 못했다.

알고리즘 시간에 배웠다! A 라는 답을 구하기 어려우면 B 라는 답을 구해 A 를 구하는 방법도 생각 해보라고..

이 문제가 바로 그 문제다.

열외해야 하는 병사의 수는 가장 긴 감소하는 부분수열에 포함 되지 않는 원소이다.

하지만 직접적으로 열외해야 하는 병사의 수는 구하기 어렵다.

때문에 B 라는 답, 즉 가장 긴 감소하는 부분수열 길이를 구한 뒤 전체 수열길이에서 B 를 빼주면 A 를 구할 수 있다.

아직 이런식으로 문제에 어떤 알고리즘을 사용해야 하는지 생각하는게 어렵다.

만약 문제가 직접적으로 가장 긴 감소하는 부분수열의 길이를 구하라고 했다면 구할 수 있었을 것이다..

수능 공부할 때도 꼬아서 나온 문제는 잘 못 풀었는데 여전하다 ㅡㅡ;


def solution():
	dp = [1] * n

	for i in range(1, n):
		for j in range(i):
			if arr[i] < arr[j]:
				dp[i] = max(dp[i], dp[j] + 1)

	return n - max(dp)


if __name__ == '__main__':
	n = int(input())
	arr = list(map(int, input().split()))
	print(solution())



Categories:

Updated:

Leave a comment