인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

tocc22님의 프로필 이미지

작성한 질문수

세계 대회 진출자가 알려주는 코딩테스트 A to Z (with Python)

다이나믹 프로그래밍(DP) 알고리즘 [문제풀이] : BOJ 11053

DP 11053관련 질문있습니다.

해결된 질문

작성

·

61

0

안녕하세요, DP 백준 11053문제관련해서 질문이 있습니다.

1) 부분수열중 가장 긴 거라했으니

N = int(input())

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

print(len(sorted(list(set(lit)))))

이렇게 set으로 중복처리를해주고 그 길이를 구하면 안되는건가요?

2) 1) 방법이 틀려 부분수열이 아니라 기존에 input값에서 길이를 구하는걸로 구했을때 하기와 같이 했습니다.

N = int(input())

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

dp = [0] * (N+1)

for i in range(1, N):

dp[i-1] = (lit[i] - lit[i-1])

print(sum([1 for i in dp if i>0])+1)

이전값과 비교하여 양수이면 남기고 남겨진값들로 길이를 구하려했는데

1), 2) 방법에서 둘 다 채점이 틀려서 제가 문제 자체를 이해를 잘못하고 있는지 하여 문의드립니다.

답변 1

0

알리 Ally님의 프로필 이미지
알리 Ally
지식공유자

안녕하세요, tocc22님!

부분수열의 정의에 대해 혼동을 하여 발생한 문제 같습니다.

부분수열은 기존 수열에서 원래 순서를 유지한 채 일부 원소를 골라내어 만든 새로운 수열을 의미합니다.

따라서, 입력으로 주어진 수열에 대해 순서를 바꾸면 안됩니다!

 

질문해주신 코드에 대해 반례 테스트 케이스를 첨부하였으니 참고하시면 좋을 거 같습니다!

 

[1번째 코드의 반례 테스트 케이스]

7
10 20 10 30 20 50 40

답은 4이며, 길이가 4인 부분 수열의 후보는 {10, 20, 30, 40} 또는 {10, 20, 30, 50} 이 있습니다.

 

[2번째 코드의 반례 테스트 케이스]

8
1 2 1 2 1 2 1 2

답은 2이며, 길이가 2인 부분 수열의 후보는 {1, 2} 가 있습니다.

 


질문에 대해 만족스러운 답변이 되었기를 바랍니다!

추가로 궁금하신 점이나 더 자세한 설명이 필요하시다면 언제든지 말씀해 주세요. 😄

tocc22님의 프로필 이미지
tocc22
질문자

답변 감사합니다. 부분수열을 부분집합으로 생각하고 문제를 풀었던거같습니다...다시 풀어보겠습니다!

tocc22님의 프로필 이미지

작성한 질문수

질문하기