ps:problems:boj:7570
줄 세우기
ps | |
---|---|
링크 | acmicpc.net/… |
출처 | BOJ |
문제 번호 | 7570 |
문제명 | 줄 세우기 |
레벨 | 골드 3 |
분류 |
그리디, DP |
시간복잡도 | O(n) |
인풋사이즈 | n <= 1,000,000 |
사용한 언어 | Python |
제출기록 | 144088KB / 512ms |
최고기록 | 512ms |
해결날짜 | 2022/01/14 |
풀이
- 잘 관찰해보면, 연속된 숫자가 오름차순으로 나타나는 서브시퀀스를 찾으면, 나머지 숫자들을 앞이나 뒤로 이동시킴으로써 정렬된 배열을 만들수 있다는 것을 알수 있다. 결국, 연속된 숫자가 오름차순으로 나타나는 서브시퀀스중에서 가장 길이가 긴 것을 찾는 문제가 된다. 전체 길이에서 찾은 서브시퀀스의 길이를 뺀 값이 답이 된다.
- 연속된 숫자가 오름차순으로 나타나는 서브시퀀스중 가장 길이가 긴 것을 찾는 방법은 DP를 사용한다. length[x] 를 x로 끝나는 서브 시퀀스의 최대 길이라고 하고, 처음에는 이값을 전부 0으로 초기화한다. 수열 A를 앞에서부터 이터레이션해서 얻은 A[i]에 대해서 length[A[i]] = length[A[i-1]]+ 1 로 업데이트 해주면 된다. 그러면 max(length)로 가장 긴 서브시퀀스의 길이를 찾을수 있다. 시간복잡도는 O(n)
코드
"""Solution code for "BOJ 7570. 줄 세우기".
- Problem link: https://www.acmicpc.net/problem/7570
- Solution link: http://www.teferi.net/ps/problems/boj/7570
Tags: [Greedy] [DP]
"""
def main():
N = int(input())
nums = [int(x) for x in input().split()]
lengths = [0] * (N + 1)
for num in nums:
lengths[num] = lengths[num - 1] + 1
print(N - max(lengths))
if __name__ == '__main__':
main()
ps/problems/boj/7570.txt · 마지막으로 수정됨: 2022/01/14 14:18 저자 teferi
토론