1 분 소요

백준 11053번 가장 긴 증가하는 부분 수열(LIS) 문제 풀이를 해보겠습니다.

출처 : 백준

문제

수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오.

예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이고, 길이는 4이다.

입력

첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000)이 주어진다.

둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ Ai ≤ 1,000)

출력

첫째 줄에 수열 A의 가장 긴 증가하는 부분 수열의 길이를 출력한다.

풀이

문제 설명: LIS(Longest Increasing Subsequence)를 구하는 문제

문제 중요 조건

  • 길이를 구하는 문제이기 때문에 dp[i]에 길이를 저장한다.
  • j < i일때, sequence[j] < sequence[i]라면
    • 부분 증가 수열이다.
    • dp[i]와 dp[j] + 1 을 비교한다.
    • 둘 중 더 큰 수를 dp[i]에 저장한다.

코드

import sys
input = sys.stdin.readline

def main():
    N = int(input().strip())
    sequence = list(map(int, input().split()))
    
    # N은 1이상, N이 1이면 길이는 무조건 1
    if N==1:
        print(1)
        return

    # 수열의 길이 저장
    # dp[i]는 sequence[i]를 마지막으로 하는 가장 긴 증가 부분 수열의 길이
    dp = [1] * N 
    # 자기 자신 만으로 길이가 1인 부분 수열이기 때문에 1로 초기화
    
    # 현재 수 i와 i이전의 모든 수 j를 비교
    for i in range(N) :
        for j in range(i) :
            if sequence[j] < sequence[i] :
                dp[i] = max(dp[i], dp[j] + 1) 
                # 증가 부분 수열이 성립하면 수열 길이를 1 증가 시키고, i와 j중 더 큰 길이를 저장
       
    print(max(dp))

main()        

댓글남기기