Algorithm/BaekJoon

백준 22.02.18. 11053번 - 가장 긴 증가하는 부분 수열

HappyFrog 2022. 2. 19. 03:17


↓ 틀린 코드

더보기
n = int(input())

arr = list(map(int, input().split()))

dp = [[0] for i in range(n)]
dp[0] = [arr[0]]

for i in range(1, n):
    if arr[i] > dp[i-1][-1]:
        dp[i] = dp[i-1] + [arr[i]]
    else:
        dp[i] = dp[i-1]

print(len(dp[-1]))

주어진 수열의 0인덱스가 최솟값이 아닐 수도 있는데 주어진 수열의 0을 지정해버리는 실수를 했습니다.

 

N = int(input())

arr = list(map(int, input().split()))

dp = [1] * N

for i in range(1, N):
    if max(arr[:i]) < arr[i]:
        dp[i] = max(dp[i], dp[i-1] + 1)

    dp[i] = max(dp[i], dp[i-1])

print(dp[-1])

dp에 주어진 n개의 수열에서 나오는 최대수열갯수를 저장하고싶어서 위처럼 작성해보았지만 계속 틀렸다고 뜹니다.

 

못찾은 반례가 있나봅니다.

검색해서 나온 값들은 3가지 수로 10 20 10이 주어졌을 때 dp[-1]이 1이 출력되어 왜 2가 아니라 1인지 의아하여 작성해보았는데 무수한 오답처리만 받고 끝났습니다.


N = int(input())

arr = list(map(int, input().split()))

dp = [1] * N

for i in range(N):
    for j in range(i):
        if arr[j] < arr[i]:
            dp[i] = max(dp[i], dp[j]+1)

print(max(dp))
  • '길이'를 구하는 문제인데 수열 자체를 구하려다보니 꼬였던 것 같습니다.
  • 우선 증가하는 수열의 최소길이는 1이므로 dp의 모든 요소를 1로 맞춰줍니다.
    • dp의 최대길이는 입력받은 수의 갯수와 같으므로 * N 을 해주었습니다.
  • 이어서 지정한 수(arr[i])와 그 이전의 수들(arr[j])을 비교하여 증가하는 수열일 때, 길이의 최댓값을 구해줍니다.
    • 만약 arr[i]가 이전의 수들보다 크다면 증가하는 수열이 될 수 있으므로 dp[j] +1을 해줍니다.
    • 하지만 이를 반복하면 중복실행되어 오답이 나올 수 있으므로 max()함수를 이용하여
    • dp[i]에 새로운 값이 지정되지 않았다면 1일테니 max(dp[i], dp[j]+1)을 해줍니다.
  • 마지막으로 중첩반복문을 통해 구해진 dp리스트의 최댓값을 출력해주면 됩니다.