728x90
어떤 임의의 수열이 주어질 때, 이 수열에서 몇 개의 수들을 제거해서 부분수열을 만들 수 있다. 이때 만들어진 부분수열 중 오름차순으로 정렬된 가장 긴 수열을 최장 증가 부분 수열$($LIS: Longest Increasing Subsequence$)$이라 한다.
LIS의 길이를 구하는 문제
더보기
문제
수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오.
예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이고, 길이는 4이다.
입력
첫째 줄에 수열 A의 크기 N $(1 ≤ N ≤ 1,000)$이 주어진다.
둘째 줄에는 수열 A를 이루고 있는 $A_i$가 주어진다. $($1 ≤ $A_i$ ≤ 1,000$)$
출력
첫째 줄에 수열 A의 가장 긴 증가하는 부분 수열의 길이를 출력한다.
증가하는 원소를 부분수열의 원소로 채택하면서
길이를 저장하는 리스트를 생성해서 길이를 업데이트 하고, 최댓값 출력
from sys import stdin
input = stdin.readline
N = int(input())
A = list(map(int, input().split()))
li = [1]*N
for i in range(N):
a = A[i]
for j in range(i+1, N):
if A[j] > a and li[j] < li[i]+1:
li[j] = li[i]+1
print(max(li))
최장 증가 부분 수열을 생성해서 그 수열의 길이를 출력
부분 수열을 생성하면서 마지막 원소보다 더 큰 원소를 마주치면 부분 수열에 추가하고,
아니면 증가 수열 상태를 유지하도록 중간에 숫자를 집어 넣어서
향후 더 긴 부분 수열이 되도록 부분 수열을 업데이트 함
from sys import stdin
input = stdin.readline
def main():
N = int(input())
A = list(map(int, input().split()))
p = [A[0]]
for a in A[1:]:
if a > p[-1]: p.append(a) # 증가하는 수열이 되도록 원소로 추가함
else:
# 향후 더 긴 수열을 생성할 수 있도록 부분 수열의 길이에 영향을 미치지 않고 내부 원소 값만 변경
for i, b in enumerate(p):
if a <= b: p[i] = a; break
print(len(p))
if __name__ == "__main__":
main()
더보기
예제 입력 1
6
10 20 10 30 20 50
예제 출력 1
4
'IT > Python' 카테고리의 다른 글
[백준] 11725번 트리의 부모 찾기 [Python] - 그래프 이론, BFS, DFS (1) | 2023.10.20 |
---|---|
[백준] 7662번 이중 우선순위 큐[Python] - 자료구조 (0) | 2023.10.20 |
[백준] 14500번 테트로미노 [Python] - BFS, DFS (1) | 2023.10.19 |
[백준] 15663~15666번 N과 M[9~12] [Python] - 순열, 조합, 중복 (0) | 2023.10.18 |