ps:problems:boj:18353
병사 배치하기
ps | |
---|---|
링크 | acmicpc.net/… |
출처 | BOJ |
문제 번호 | 18353 |
문제명 | 병사 배치하기 |
레벨 | 실버 2 |
분류 |
LIS |
시간복잡도 | O(nlogn) |
인풋사이즈 | n<=2000 |
사용한 언어 | Python |
제출기록 | 32928KB / 72ms |
최고기록 | 56ms |
해결날짜 | 2022/02/27 |
풀이
- 발상에 걸린 시간: 매우짧음 / 구현에 걸린 시간: 매우짧음
- 그냥 문제를 읽으면 최장 감소 부분 수열의 길이를 구하라는 문제라는 것을 바로 알수 있다.
- 전체 길이에서 최장 감소 부분 수열의 길이를 뺀 값이 열외해야하는 최소 병사수가 된다.
- 최장 감소 부분 수열은, 수열을 뒤집어서 가장 긴 증가하는 부분 수열 (Longest Increasing Subsequence / LIS)을 구하면 간단하다. 시간복잡도는 O(nlogn).
코드
"""Solution code for "BOJ 18353. 병사 배치하기".
- Problem link: https://www.acmicpc.net/problem/18353
- Solution link: http://www.teferi.net/ps/problems/boj/18353
Tags: [LIS]
"""
import bisect
def main():
N = int(input()) # pylint: disable=unused-variable
nums = [int(x) for x in input().split()]
arr = []
for num in reversed(nums):
pos = bisect.bisect_left(arr, num)
if pos == len(arr):
arr.append(num)
else:
arr[pos] = num
print(N - len(arr))
if __name__ == '__main__':
main()
ps/problems/boj/18353.txt · 마지막으로 수정됨: 2022/02/28 12:38 저자 teferi
토론