From a12bfc9f70ef72f0147cac9ae463f34b578ce650 Mon Sep 17 00:00:00 2001 From: lectura7942 <81620001+lectura7942@users.noreply.github.com> Date: Fri, 14 Apr 2023 02:04:43 +0900 Subject: [PATCH] [DP] jieun-0414 --- ...73\354\203\235\352\270\264\354\210\230.py" | 22 +++++++++ ...70\354\247\221\352\261\260\353\246\254.py" | 48 +++++++++++++++++++ 2 files changed, 70 insertions(+) create mode 100644 "jieun/DP/Q35_\353\252\273\354\203\235\352\270\264\354\210\230.py" create mode 100644 "jieun/DP/Q36_\355\216\270\354\247\221\352\261\260\353\246\254.py" diff --git "a/jieun/DP/Q35_\353\252\273\354\203\235\352\270\264\354\210\230.py" "b/jieun/DP/Q35_\353\252\273\354\203\235\352\270\264\354\210\230.py" new file mode 100644 index 0000000..e7e5278 --- /dev/null +++ "b/jieun/DP/Q35_\353\252\273\354\203\235\352\270\264\354\210\230.py" @@ -0,0 +1,22 @@ +N = int(input()) + +INF = 9876543210 +prime = [2, 3, 5] + +dp = [1, 2, 3, 4, 5] + +for i in range(5, N): + # 현재 len(dp) = i + temp = INF + for j in range(i - 1, -1, -1): + for p in prime: # [2,3,5] + nxt = dp[j] * p + if nxt > dp[i - 1]: # dp[i-1]보다 큰 값 중 최소값 구해야 하므로 그 뒤는 안 봐도 됨. + temp = min(temp, nxt) + break + if nxt <= dp[i - 1]: # nxt = dp[j]*5 + break # 다음에 볼 j는 현재보다 더 작으므로 안 봐도 됨. + + dp.append(temp) + +print(dp[N - 1]) diff --git "a/jieun/DP/Q36_\355\216\270\354\247\221\352\261\260\353\246\254.py" "b/jieun/DP/Q36_\355\216\270\354\247\221\352\261\260\353\246\254.py" new file mode 100644 index 0000000..6eee400 --- /dev/null +++ "b/jieun/DP/Q36_\355\216\270\354\247\221\352\261\260\353\246\254.py" @@ -0,0 +1,48 @@ +A = input() +B = input() +A_len = len(A) +B_len = len(B) + +dp = [[0 for _ in range(B_len + 1)] for _ in range(A_len + 1)] +# 세로 A, 가로 B + 패딩 +# dp[a][b] = A의 a번째 문자, B의 b번째 문자까지 비교했을 때 일치하는 가장 긴 부분문자열 길이 + +for a in range(1, A_len + 1): + for b in range(1, B_len + 1): + dp[a][b] = max(dp[a - 1][b], dp[a][b - 1]) + if A[a - 1] == B[b - 1]: + dp[a][b] = max(dp[a][b], dp[a - 1][b - 1] + 1) + +# same[b] = a (B의 b번째 문자와 A의 a번째 문자가 일치) +# same[b] = -1 이면 A 문자와 일치하지 않음 +same = [-1 for _ in range(B_len)] + +# dp 채운 경로 백트래킹 +pa = A_len +pb = B_len +while pa > 0 and pb > 0: + if A[pa - 1] == B[pb - 1]: + same[pb - 1] = pa - 1 + pa -= 1 + pb -= 1 + elif dp[pa - 1][pb] > dp[pa][pb - 1]: + pa -= 1 + else: + pb -= 1 + +# (1) A와 일치하지 않은 B 문자는 삭제/교체 +# (2) B와 일치하지 않은 A 문자 중 뒷 부분 삭제 +ans = same.count(-1) + (A_len - max(same) - 1) + +# (3) B와 일치하지 않은 A 문자 중 앞 부분 삭제 +for i in same: + if i > -1: + ans += i + break +print(ans) + +# print(f"same:{same}") +# print(" " + " ".join(B)) +# for i in range(A_len): +# print(A[i], end=" ") +# print(dp[i+1][1:])