[python] 백준 11053번 문제풀이
백준 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()
댓글남기기