[BOJ][๐ก2][๋ฐฑ์ค#01324] ์ ์ฅ
์์ฑ:    
์ ๋ฐ์ดํธ:
์นดํ ๊ณ ๋ฆฌ: BOJ Gold II
๋ฌธ์ ์ถ์ฒ
๋ฌธ์
๋น์ ์ ๊ฒ์์ ํ๋ค ๊ฑธ๋ ค์ ์ฌํ๋ด์ฌ๋ฅผ ํด์ผ ํ๋ค. ๋น์ ์ 2์ผ ๋์ ๊ธธ ํ๋์ ์ฐ๋ ๊ธฐ๋ฅผ ์ฃผ์ฐ๋ ค ํ๋ค. โ์ด๋ฐ ์ ์ฅโ ๋งค์ผ ์์นจ ์ฒซ ๋ฒ์งธ ์ฐ๋ ๊ธฐ๊ฐ ์๋ ์์น์์ ์ถ๋ฐํ์ฌ N๋ฒ์งธ ์ฐ๋ ๊ธฐ๊ฐ ์๋ ์์น๊น์ง ๊ฑธ์ด๊ฐ๋ฉด์, ๊ธธ์ ๋์ฌ์๋ ์ฐ๋ ๊ธฐ๋ฅผ ์ฐ๋ ๊ธฐ ๋ดํฌ์ ๋ด์์ผ ํ๋ค. ๋ชจ๋ ์ฐ๋ ๊ธฐ๋ฅผ ์ฃผ์ธ ํ์๋ ์์ผ๋,ย ๊ฑธ์ด๊ฐ ๊ธธ์ ๋๋์๊ฐ ์๋ ์๊ธฐ ๋๋ฌธ์ ์ฐ๋ ๊ธฐ๋ ํญ์ ์์น ์์ผ๋ก ์ฃผ์์ผ ํ๋ค. ๊ทธ๋ฐ๋ฐ ์ฐ๋ ๊ธฐ ๋ดํฌ๊ฐ ๊ณ ๋ฌผ์ด๋ผ์ ๋ค์๊ณผ ๊ฐ์ ์ ์ฝ์ด ์๋ค.
์ฒซ์งธ ๋ ๊ณผ ๋์งธ ๋ ๊ฐ๊ฐ์ ์ฃผ์ด ์ฐ๋ ๊ธฐ์ ํฌ๊ธฐ๊ฐ ๋จ์กฐ ์ฆ๊ฐํด์ผ ํ๋ค. ๋ค์ ๋งํ๋ฉด, ๋ ๋ฒ์งธ ๋๋ ๊ทธ ์ดํ๋ก ์ฃผ์ด ์ฐ๋ ๊ธฐ์ ํฌ๊ธฐ๋ ๋ฐ๋ก ์ ์ ์ฃผ์ด ์ฐ๋ ๊ธฐ์ ํฌ๊ธฐ๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์์ผ ํ๋ค. ๊ฐ ๋ ์ ์ฃผ์ด ์ฐ๋ ๊ธฐ๋ค์ ๊ฐ์์ ํฌ๊ธฐ๋ ์์ ํ ๊ฐ์์ผ ํ๋ค.
์๋ฅผ ๋ค์ด, ์ฒซ์งธ ๋ ์๋ ํฌ๊ธฐ๊ฐ 2, 3, 3, 4์ธ ์ฐ๋ ๊ธฐ๋ฅผ ์ฐจ๋ก๋ก ์ฃผ์ธ ์ ์์ง๋ง, ํฌ๊ธฐ๊ฐ 4, 2, 3, 3์ธ ์ฐ๋ ๊ธฐ๋ฅผ ์ฐจ๋ก๋ก ์ฃผ์ธ ์๋ ์๋ค. ๋ํ ์ฒซ์งธ ๋ ์ ํฌ๊ธฐ๊ฐ 2, 3, 3, 4์ธ ์ฐ๋ ๊ธฐ๋ฅผ ์ฃผ์ ๋ค๋ฉด, ๋์งธ ๋ ์๋ ์ ํํ ํฌ๊ธฐ๊ฐ 2, 3, 3, 4์ธ ์ฐ๋ ๊ธฐ๋ฅผ ์ฃผ์์ผ ํ๋ค. ๋น์ ์ ํน์ ์ ์์ง๋ ฅ์ผ๋ก ์ค๋๊ณผ ๋ด์ผ ๊ธธ๊ฑฐ๋ฆฌ์ ์ฐ๋ ๊ธฐ๊ฐ ์ด๋ค ์์ผ๋ก ๋์ฌ์์์ง ์๋ค.ย ํ๋ฃจ๋ง๋ค ์ต๋ ๋ช ๊ฐ์ ์ฐ๋ ๊ธฐ๋ฅผ ์ฃผ์ธ ์ ์์๊น?
์ ๋ ฅ
์ฒซ ๋ฒ์งธ ์ค์๋ ์ฐ๋ ๊ธฐ์ ๊ฐ์ N์ด ์ฃผ์ด์ง๋ค. (N โค 1,000) ๋ ๋ฒ์งธ ์ค์๋ ์ฒซ์งธ ๋ ์ฐ๋ ๊ธฐ์ ํฌ๊ธฐ๊ฐ ์์น ์์๋๋ก ๊ฐ๊ฐ N๊ฐ ์ฃผ์ด์ง๋ค. ์ธ ๋ฒ์งธ ์ค์๋ ๋์งธ ๋ ์ฐ๋ ๊ธฐ์ ํฌ๊ธฐ๊ฐ ์์น ์์๋๋ก ์ฃผ์ด์ง๋ค. ์ฐ๋ ๊ธฐ์ ํฌ๊ธฐ๋ 50,000๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์์ด๋ค.
์ถ๋ ฅ
ํ๋ฃจ๋ง๋ค ์ฃผ์ธ ์ ์๋ ์ฐ๋ ๊ธฐ์ ์ต๋ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ค.
์์
์ ๋ ฅ
10
1 2 3 4 5 6 7 8 9 10
1 3 5 7 9 2 4 6 8 10
์ถ๋ ฅ
6
My Sol
N = int(input())
day1 = [0]+list(map(int, input().split()))
day2 = [0]+list(map(int, input().split()))
set_day2 = set(day2)
ret = [set() for _ in range(N+1)]
ret[0].add((0, 0))
for i in range(1, N+1):
ret[i] = ret[i-1]
cur_v = day1[i]
if cur_v not in set_day2: continue
add_list = set()
for tupp in ret[i]:
mi, ms = tupp
if day2[mi] >= cur_v: continue
for ii in range(mi+1, N+1):
if day2[ii] != cur_v: continue
add_list.add((ii, ms + 1))
check_obj = {}
for k, v in add_list:
ov = check_obj.get(k)
if ov and ov >= v: continue
check_obj[k] = v
for k, v in check_obj.items():
ret[i].add((k, v))
if not i%10:
clean = dict()
for idx, cnt in ret[i]:
if clean.get(cnt, []):
clean[cnt].append([idx, day2[idx]])
else:
clean[cnt] = [[idx, day2[idx]]]
max_cnt = max(clean.keys())
tmp = set()
for cnt, arrs in clean.items():
if (N - i) + cnt < max_cnt: continue
arrs.sort(key=lambda x: (x[1], x[0]))
cur_val = -1
for idx, val in arrs:
if val == cur_val: continue
cur_val = val
tmp.add((idx, cnt))
ret[i] = tmp
ans = 0
for sett in ret[N]:
if ans < sett[1]:
ans = sett[1]
print(ans)
๋ฌธ์ ์ ์ค๋ฅ๊ฐ ์์ด ํด๊ฒฐํ์ง ๋ชปํ๋ค๊ฐ ์ง๋ฌธ์ ํตํด ํด๊ฒฐํ ๋ฌธ์ ์๋ค. ์ค๋ฅ๋ monotonic ์ฆ๊ฐ๊ฐ ์๋ strictly ์ฆ๊ฐ, ์ฆ ์ด์ ๊น์ง ์ฃผ์ด ์ฐ๋ ๊ธฐ์ ํฌ๊ฑฐ๋ ๊ฐ์ ๊ฒ์ด ์๋๋ผ, ํฌ๊ธฐ๋ง ํด์ผํ๋ ๊ฒ์ด๋ค. DP๋ฅผ ์ด์ฉํ๋ค.
- ์ ๋ ฅ์ ์ฒ๋ฆฌํ๋ค.
- Day1์ ๊ธฐ์ค์ผ๋ก ์ด ๋ ์ฐ๋ ๊ธฐ๋ฅผ ์ฃผ์ธ์ง, ์ค์ง ์์์ง์ ๋ฐ๋ผ DP๊ฐ ํ์ฅ๋๋ ๋ฐฉ์์ด๋ค.
- ๋ง์ฝ Day1์ ์ด๋ ํ ๋ ์ด Day2์ ์ฐ๋ ๊ธฐ ๋ฆฌ์คํธ์ ์๋ค๋ฉด ์ฃผ์๋ ์๋ฏธ๊ฐ ์์ผ๋ฏ๋ก continue
- ์ด์ ๊น์ง ์ฃผ์ธ ์ ์๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ์ ์ค ret[i-1]์์ ๊ฐ์ ธ์๊ณ , ์ด๋ฅผ ํ๋ํ๋ ๊น๋ณธ๋ค.
- Day1์ ํน์ ์ฐ๋ ๊ธฐ๋ฅผ ์ฃผ์ ์ ๊ฒฝ์ฐ ์ด์ ๊น์ง์ ์ฐ๋ ๊ธฐ๋ฅผ ์ค๋ ๊ฒฝ์ฐ์์ ์ด๋ณด๋ค ๊ฐ๊ฑฐ๋ ํฐ ์ฐ๋ ๊ธฐ๋ฅผ ์ฃผ์ ๋ค๋ฉด continue
- ํ์ฌ๊น์ง์ ์ฐ๋ ๊ธฐ ํฌ๊ธฐ๊ฐ ํ์ฌ ์ฐ๋ ๊ธฐ๋ณด๋ค ์์ ๊ฒฝ์ฐ ์ง์ ์ ์ฐ๋ ๊ธฐ๋ฅผ ์ฃผ์ด ๋ ์ดํ๋ก ๊ฐ์ฅ ๊ฐ๊น์ด ๋ ์ ์ธ๋ฑ์ค๋ฅผ ์์ set์ธ add_list์ ์ถ๊ฐํด์ค๋ค.
- ๊ฐ์ ์ฐ๋ ๊ธฐ์ ๊ฐ์๋ผ๋ฉด ๋ ์์ ์ฐ๋ ๊ธฐ, ๋ ๋นจ๋ฆฌ ์ฃผ์ธ์๋ก ์ด๋์ด๋ฏ๋ก ๊ทธ์ ๋ํ ์ฒ๋ฆฌ๋ฅผ ํด์ค ์ต์ ์ ์ฐ๋ ๊ธฐ๋ฅผ ret[i]์ ๋ฃ๋๋ค.
- ์ด๋ ๊ฒ ๋๋ค๋ฉด ๊ธฐํ๊ธ์์ ์ผ๋ก set์ด ๋ง์์ง๋ฏ๋ก 10๊ฐ ๋จ์๋ง๋ค ์ต์ ์ ๊ฒฝ์ฐ๋ฅผ ์ ์ธํ ๋๋จธ์ง๋ฅผ ์ ๊ฑฐํด์ค๋ค.
- ๋ง์ง๋ง ret[N]์ ๋ชจ๋ set์์ ๋ชจ์์จ ์ฐ๋ ๊ธฐ์ ๊ฐ์ ์ค ์ต๋๊ฐ์ ์ถ๋ ฅํ๋ค.
๊ฒฐ๊ณผ
๋ง์์ต๋๋ค!!
๋ชจ๋ฒ๋ต์
import sys
input = sys.stdin.readline
N = int(input())
lst1 = [0] + list(map(int, input().split()))
lst2 = [0] + list(map(int, input().split()))
dp = [0] * (N + 1)
max_cnt = 0
for i in range(1, N + 1):
cnt = 0
for j in range(1, N + 1):
# ์ฒซ๋ ์ฐ๋ ๊ธฐ์ ๋์งธ๋ ์ฐ๋ ๊ธฐ๊ฐ ์ผ์นํ๋ฉด
if lst1[i] == lst2[j]:
dp[j] = max(dp[j], cnt + 1)
# ๋์งธ๋ ์ฐ๋ ๊ธฐ๋ฅผ ์ ํํ๋ค๋ฉด, ๋ค์์ ์ฒซ์งธ๋ ์ ์ ํํ๋ ์ฐ๋ ๊ธฐ๋ ๋์งธ๋ ์ ํํ๋ ์ฐ๋ ๊ธฐ๋ณด๋ค ์ปค์ผํจ
if lst1[i] > lst2[j] and dp[j] > cnt:
cnt = dp[j]
max_cnt = max(max_cnt, dp[j])
print(max_cnt)
DP๋ฅผ ์ด์ฉํด ๋๋ฌด๋ ์ฝ๊ฒ ํ์ ์ฝ๋๋ฅผ ๋ถ์ํด๋ณด๋ ค ํ๋ค. ํ์ด ์๊ฐ์ ๋์ 1/15์ด๊ณ , ์ฝ๋ ์๋ ์ ๋ฐ ์์ค์ด๋ค.
๋๊ธ๋จ๊ธฐ๊ธฐ