( •̀ ω •́ )✧
BOJ 18353. 병사 배치하기 (Silver 2) / 가장 긴 감소 수열 찾기 본문
🔎 BOJ 18353. 병사 배치하기 (Silver 2)
https://www.acmicpc.net/problem/18353
18353번: 병사 배치하기
첫째 줄에 N이 주어진다. (1 ≤ N ≤ 2,000) 둘째 줄에 각 병사의 전투력이 공백을 기준으로 구분되어 차례대로 주어진다. 각 병사의 전투력은 10,000,000보다 작거나 같은 자연수이다.
www.acmicpc.net
💡 SOL
import sys
from bisect import bisect_left
input = sys.stdin.readline
N = int(input())
arr = list(map(int, input().split()))
dp = [0]
for a in arr[::-1]:
if dp[-1] < a:
dp.append(a)
else:
dp[bisect_left(dp, a)] = a
print(N - (len(dp) - 1))
기존 수열을 유지할 수 있는 경우( = 증가하는 수열에서 내가 가장 큰 값인 경우)에는 dp.append(a)
아닌 경우에는 bisect_left
라이브러리를 사용하여 해당 index 자리를 나로 대체한다.
정렬을 해치지 않고, 수열의 크기에는 영향이 없게 작은 값으로 업데이트 하기때문에, 가장 긴 수열을 만들 수 있는 가능성이 커진다.
💭 TIL
from bisect import bisect_left, bisect_right
index = bisect_left(arr, num)
주의할 점은 bisect 라이브러리는 증가하는(=정렬된) 리스트를 기준으로 실행된다.
따라서 이 문제와 같이 감소하는 수열을 찾는 경우라면,
주어진 배열을 뒤에서부터 탐색하여(arr[::-1]
) 증가하는 수열을 찾음으로써 감소하는 수열을 얻을 수 있다.
'🤖 알고리즘' 카테고리의 다른 글
BOJ 2110. 공유기 설치 (Gold 4) / 이분탐색 조건 설정 (0) | 2023.10.20 |
---|---|
BOJ 16118. 달빛 여우 (Python) / 다익스트라 (0) | 2023.08.31 |
BOJ 1789. 수들의 합 (0) | 2023.08.10 |
BOJ 1456. 거의 소수 (0) | 2023.04.06 |
BOJ 2800. 괄호 제거 (0) | 2023.03.29 |
Comments