[파이썬 알고리즘 문제풀이] - Section8 / Dynamic programming(동적계획법) - 5

Chooooo·2023년 2월 14일
0

최대 선 연결하기

왼쪽의 번호와 오른쪽의 번호가 있는 그림에서 같은 번호끼리 선으로 연결하려고 합니다. 왼쪽번호는 무조건 위에서부터 차례로 1부터 N까지 오름차순으로 나열되어 있습니다.오른쪽의 번호 정보가 위부터 아래 순서로 주어지만 서로 선이 겹치지 않고 최대 몇개의 선을 연결할 수 있는 지 구하는 프로그램을 작성하세요.

위의 그림은 오른쪽 번호 정보가 4 1 2 3 9 7 5 6 10 8 로 입력되었을 때 선이 서로겹치지 않고 연결할 수 있는 최대 선을 개수 6을 구한 경우입니다.

▣ 입력설명
첫 줄에 자연수 N(1<=N<=100)이 주어집니다.
두 번째 줄에 1부터 N까지의 자연수 N개의 오른쪽 번호 정보가 주어집니다. 순서는 위쪽번호 부터 아래쪽번호 순으로입니다.
▣ 출력설명
첫 줄에 겹치지 않고 그을 수 있는 최대선의 개수를 출력합니다.

▣ 입력예제 1
10
4 1 2 3 9 7 5 6 10 8

▣ 출력예제 1
6

import sys
sys.stdin = open("input.text", "rt")

#최대 선 연결하기
n = int(input())
data = list(map(int, input().split()))
dp = [0] * n
dp[0] = 1
res = 0
for i in range(1,n):
    max_length = 0
    for j in range(i):
        if data[j] < data[i] and dp[j] > max_length:
            max_length = dp[j]
    dp[i] = max_length + 1 #이전까지의 최장거리 + 1
res = max(dp)
print(res)

⚽ 코멘트

두 조건이 나란히 오름차순처럼 겹치는 것이 없이 순서대로 나열되는 느낌의 문제는 최장 부분 증가수열을 생각해볼 수 있어.

  • 이 문제를 보면 엮이는거 없이 둘다 교차되는 것 없는 최대선 개수의 개수.
  • 최장 부분 증가수열 유형의 문제는 많이 풀어보면 느낌이 온다.
profile
back-end, 지속 성장 가능한 개발자를 향하여

0개의 댓글