
유형 : 다이나믹 프로그래밍 / 그리디
그리디 아이디어를 떠올리고 DP로 구현해야 하는 문제입니다.
문제에서 요구하는 최종 상태는
1, 2, 3, 4 . . ., N 입니다.
따라서,
서로 이웃한 두 수 x, x + 1 이 현재 배열에서도 같은 순서로 등장한다면,
이 두 수는 굳이 움직일 필요가 없습니다.
1 2 4 3
으로 줄이 서있다고 가정해봅시다.
1 2 3 이 가장 길게 연속으로 이어짐으로 건들 필요가 없습니다.
4 는 연속되지 않음으로 옮겨야 합니다.
4 를 뒤로 옮기면 1 2 3 4 로 1번의 바꾸기로 오름차순을 만들었습니다.
이번엔
1 2 5 4 3
으로 줄이 서있다고 가정해봅시다.
이 역시 1 2 3 이 가장 길게 연속으로 이어짐으로 건들 필요가 없습니다.
5 4 의 위치는 옮겨야 합니다.
5 와 4 를 뒤로 적절히 옮기면 1 2 3 4 5 로 2번의 바꾸기로 오름차순을 만들었습니다.
즉, 가장 잘 정렬된 어린이 배열을 유지하고 나머지 줄 잘못 선 분탕치는 어린이들을 처리하는게 최선의 움직임입니다.
따라서 문제의 답은,
P[i] = P[i - 1] + 1 (i > 0) 을 성립하는 최장 길이 연속 수열을 찾고 N 에 뺀 값
입니다.
최장 길이 연속 수열을 찾아봅시다.
어떻게?
- DP 로!
점화식은
dp[x] = dp[x - 1] + 1
위와 같습니다.
현재 수 X 는 X - 1 의 최장 길이에 1 을 더한 값이다.
import sys
input = sys.stdin.readline
N = int(input())
arr = list(map(int, input().split()))
dp = [0] * (N + 1)
for x in arr:
dp[x] = dp[x - 1] + 1
print(N - max(dp))'PS > 🟡 GOLD' 카테고리의 다른 글
| [PYTHON] 백준 13502번 단어퍼즐 2 (0) | 2025.11.11 |
|---|




