코딩 테스트 오답

[코딩테스트] 백준 - DP문제 오답 모음(SilverⅤ~SilverⅠ)

dvl.hyeon_ 2025. 4. 25. 10:07
반응형

2025.05.02~ (추가 중)

 

✔️백준 #11722 "가장 긴 감소하는 부분 수열"

https://www.acmicpc.net/problem/11722

 

문제 요약

수열 A가 주어졌을 때, 가장 긴 감소하는 부분 수열을 구하는 프로그램을 작성
ex) A = {10, 30, 10, 20, 20, 10} → A' = {30, 20, 10} & 길이 3

 

▫️입력:

    ▪️첫째 줄: 수열 A의 크기 N (1 ≤ N ≤ 1,000)

    ▪️둘째 줄: 수열 A를 이루고 있는 Ai (1 ≤ Ai ≤ 1,000)

▫️출력: 수열 A의 가장 긴 감소하는 부분 수열의 길이 출력  

 

나의 정답

N = int(input())
seq = list(map(int, input().split()))

# DP 배열 초기화
F = [1] * N  # 각 원소는 자기 자신으로 시작 가능하므로 1로 초기화

# DP식 구현
for i in range(N):  	# 현재 위치
    for j in range(i):  # 이전 위치
        if seq[i] < seq[j]:
            F[i] = max(F[i], F[j] + 1)

# 결과 출력
print(max(F))

 

풀이 예시

N = 6, seq = [10, 30, 10, 20, 20, 10]

F: 감소하는 부분 수열의 길이를 저장하는 DP배열

 

▪️i = 0 (A[0] = 10)

   ▫️이전 비교할 항 없음 → 그대로

   ▫️F = [1, 1, 1, 1, 1, 1]


▪️i = 1 (A[1] = 30)

   ▫️j = 0 (A[0] = 10) → 30 < 10 ❌

   ▫️F = [1, 1, 1, 1, 1, 1]


▪️i = 2 (A[2] = 10)

   ▫️j = 0 (A[0] = 10) → 10 < 10 ❌

   ▫️j = 1 (A[1] = 30) → 10 < 30 ✅ → F[2] = max(1, F[1] + 1) = max(1, 2) = 2

   ▫️F = [1, 1, 2, 1, 1, 1]


▪️i = 3 (A[3] = 20)

   ▫️j = 0 (A[0] = 10) → 20 < 10 ❌

   ▫️j = 1 (A[1] = 30) → 20 < 30 ✅ → F[3] = max(1, F[1] + 1) = 2

   ▫️j = 2 (A[2] = 10) → 20 < 10 ❌

   ▫️F = [1, 1, 2, 2, 1, 1]


▪️i = 4 (A[4] = 20)

   ▫️j = 0 (A[0] = 10) → 20 < 10 ❌

   ▫️j = 1 (A[1] = 30) → 20 < 30 ✅ → F[4] = max(1, F[1] + 1) = 2

   ▫️j = 2 (A[2] = 10) → 20 < 10 ❌

   ▫️j = 3 (A[3] = 20) → 20 < 20 ❌

   ▫️F = [1, 1, 2, 2, 2, 1]


▪️i = 5 (A[5] = 10)

   ▫️j = 0 (A[0] = 10) → 10 < 10 ❌

   ▫️j = 1 (A[1] = 30) → 10 < 30 ✅ → F[5] = max(1, F[1]+1) = 2

   ▫️j = 2 (A[2] = 10) → 10 < 10 ❌

   ▫️j = 3 (A[3] = 20) → 10 < 20 ✅ → F[5] = max(2, F[3]+1) = 3

   ▫️j = 4 (A[4] = 20) → 10 < 20 ✅ → F[5] = max(3, F[4]+1) = 3

   ▫️F = [1, 1, 2, 2, 2, 3]


틀린 이유

DP 배열에 부분 수열의 길이를 저장하는 것까지는 생각했는데, DP식을 제대로 세우지 못함... 

특히, max(F[i], F[j]+1)을 생각 못했음 ㅠ!


✔️백준 #15486 "퇴사2"

https://www.acmicpc.net/problem/15486

 

문제 요약

 

▫️입력:

    ▪️

▫️출력: 

 

나의 정답

N = int(input())
seq = list(map(int, input().split()))

# DP 배열 초기화
F = [1] * N  # 각 원소는 자기 자신으로 시작 가능하므로 1로 초기화

# DP식 구현
for i in range(N):  	# 현재 위치
    for j in range(i):  # 이전 위치
        if seq[i] < seq[j]:
            F[i] = max(F[i], F[j] + 1)

# 결과 출력
print(max(F))

 

틀린 이유

 

반응형