From 433e17e09749391667340f8c87456dad73d6cd35 Mon Sep 17 00:00:00 2001
From: SSUM <116950962+ssum21@users.noreply.github.com>
Date: Fri, 4 Apr 2025 12:18:12 +0900
Subject: [PATCH] =?UTF-8?q?[Gold=20IV]=20Title:=20=EC=82=AC=EC=A0=84=20?=
=?UTF-8?q?=EC=88=9C=20=EC=B5=9C=EB=8C=80=20=EA=B3=B5=ED=86=B5=20=EB=B6=80?=
=?UTF-8?q?=EB=B6=84=20=EC=88=98=EC=97=B4,=20Time:=2036=20ms,=20Memory:=20?=
=?UTF-8?q?32412=20KB=20-BaekjoonHub?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../README.md | 53 +++++++++++++++++++
.../사전 순 최대 공통 부분 수열.py | 41 ++++++++++++++
2 files changed, 94 insertions(+)
create mode 100644 백준/Gold/30805. 사전 순 최대 공통 부분 수열/README.md
create mode 100644 백준/Gold/30805. 사전 순 최대 공통 부분 수열/사전 순 최대 공통 부분 수열.py
diff --git a/백준/Gold/30805. 사전 순 최대 공통 부분 수열/README.md b/백준/Gold/30805. 사전 순 최대 공통 부분 수열/README.md
new file mode 100644
index 0000000..369825e
--- /dev/null
+++ b/백준/Gold/30805. 사전 순 최대 공통 부분 수열/README.md
@@ -0,0 +1,53 @@
+# [Gold IV] 사전 순 최대 공통 부분 수열 - 30805
+
+[문제 링크](https://www.acmicpc.net/problem/30805)
+
+### 성능 요약
+
+메모리: 32412 KB, 시간: 36 ms
+
+### 분류
+
+그리디 알고리즘
+
+### 제출 일자
+
+2025년 4월 4일 12:17:59
+
+### 문제 설명
+
+
어떤 수열이 다른 수열의 부분 수열이라는 것은 다음을 의미합니다.
+
+
+ - 해당 수열의 원소들이 다른 수열 내에서 순서대로 등장합니다.
+ - 예를 들어, $\{1,1,5\}$는 $\{3,\underline{\color{blue} 1} ,4,\underline{\color{blue} 1} ,\underline{\color{blue} 5} ,9\}$의 부분 수열이지만, $\{1,5,1\}$의 부분 수열은 아닙니다.
+
+
+또한, 어떤 수열이 다른 수열보다 사전 순으로 나중이라는 것은 다음을 의미합니다.
+
+
+ - 두 수열 중 첫 번째 수가 큰 쪽은 사전 순으로 나중입니다.
+ - 두 수열의 첫 번째 수가 같다면, 첫 번째 수를 빼고 두 수열을 다시 비교했을 때 사전 순으로 나중인 쪽이 사전 순으로 나중입니다.
+ - 길이가 $0$인 수열과 다른 수열을 비교하면, 다른 수열이 사전 순으로 나중입니다.
+
+
+양의 정수로 이루어진 길이가 $N$인 수열 $\{A_1,\cdots ,A_N\}$이 주어집니다. 마찬가지로 양의 정수로 이루어진 길이가 $M$인 수열 $\{B_1,\cdots ,B_M\}$이 주어집니다.
+
+수열 $A$와 수열 $B$가 공통으로 갖는 부분 수열들 중 사전 순으로 가장 나중인 것을 구하세요.
+
+### 입력
+
+ 첫 줄에 수열 $A$의 길이 $N$이 주어집니다. $(1 \le N \le 100)$
+
+둘째 줄에 $N$개의 양의 정수 $A_1,A_2,\cdots,A_N$이 주어집니다. $(1 \le A_i \le 100)$
+
+셋째 줄에 수열 $B$의 길이 $M$이 주어집니다. $(1 \le M \le 100)$
+
+넷째 줄에 $M$개의 양의 정수 $B_1,B_2,\cdots,B_M$이 주어집니다. $(1 \le B_i \le 100)$
+
+### 출력
+
+ $A$와 $B$의 공통 부분 수열 중 사전 순으로 가장 나중인 수열의 크기 $K$를 출력하세요.
+
+ $K \ne 0$이라면, 다음 줄에 $K$개의 수를 공백으로 구분해 출력하세요. $i$번째 수는 $A$와 $B$의 공통 부분 수열 중 사전 순으로 가장 나중인 수열의 $i$번째 수입니다.
+
diff --git a/백준/Gold/30805. 사전 순 최대 공통 부분 수열/사전 순 최대 공통 부분 수열.py b/백준/Gold/30805. 사전 순 최대 공통 부분 수열/사전 순 최대 공통 부분 수열.py
new file mode 100644
index 0000000..31029fb
--- /dev/null
+++ b/백준/Gold/30805. 사전 순 최대 공통 부분 수열/사전 순 최대 공통 부분 수열.py
@@ -0,0 +1,41 @@
+import sys
+
+input = sys.stdin.readline
+
+n = int(input())
+A = list(map(int, input().split()))
+m = int(input())
+B = list(map(int, input().split()))
+
+nextA = [[-1] * 101 for _ in range(n+1)]
+nextB = [[-1] * 101 for _ in range(m+1)]
+
+for i in range(n-1, -1 ,-1):
+ for num in range(1, 101):
+ nextA[i][num] = nextA[i+1][num]
+ nextA[i][A[i]] = i
+
+for i in range(m-1, -1 ,-1):
+ for num in range(1, 101):
+ nextB[i][num] = nextB[i+1][num]
+ nextB[i][B[i]] = i
+
+result = []
+i = j = 0
+while i