사용자 도구

사이트 도구


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()

토론

댓글을 입력하세요:
Y A​ I W H
 
ps/problems/boj/7570.txt · 마지막으로 수정됨: 2022/01/14 14:18 저자 teferi