[BOJ][๐ก5][๋ฐฑ์ค#14699] ๊ด์ ์ฐ ๋ฑ์ฐ
์์ฑ:    
์ ๋ฐ์ดํธ:
์นดํ ๊ณ ๋ฆฌ: BOJ Gold V
๋ฌธ์ ์ถ์ฒ
๋ฌธ์
์์ธ๋ํ๊ต์๋ โ๋๊ฐ ์กฐ๊ตญ์ ๋ฏธ๋๋ฅผ ๋ฌป๊ฑฐ๋ ๊ณ ๊ฐ๋ฅผ ๋ค์ด ๊ด์ ์ ๋ณด๊ฒ ํ๋ผโ๋ผ๋ ์ ๋ช ํ ๋ฌธ๊ตฌ๊ฐ ์๋ค. ์ด๋ ๋ Unused๋ Corea์๊ฒ ์กฐ๊ตญ์ ๋ฏธ๋๋ฅผ ๋ฌผ์๊ณ , Corea๋ ์ง์ ๊ด์ ์ฐ์ ์ฌ๋ผ๊ฐ ์กฐ๊ตญ์ ๋ฏธ๋๋ฅผ ๋ณด๊ณ ๋ตํด ์ฃผ๊ธฐ๋ก ํ๋ค. ๊ด์ ์ฐ์ ๋ฑ์ฐ๋ก๋ 1๋ถํฐ N๊น์ง์ ์๋ก ๋ค๋ฅธ ๋ฒํธ๊ฐ ๋ถ์ด ์๋ N๊ฐ์ ์ผํฐ์ ๋ ์ผํฐ ์ฌ์ด๋ฅผ ์ค๊ฐ ์ ์๋ M๊ฐ์ ๊ธธ๋ค๋ก ์ด๋ฃจ์ด์ ธ ์๋ค. Corea๋ ์ง๋ฉด์์๋ถํฐ ์ฐ์ ์ค๋ฅด๋ ๊ฒ์ ๋๋ฌด ๊ท์ฐฎ๋ค๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์, ์ผ์ด๋ธ์นด๋ฅผ ํ๊ณ ์์์ ์ผํฐ์์ ๋ด๋ฆฐ ๋ค์ ๋ฑ์ฐ์ ์์ํ๊ธฐ๋ก ํ๋ค. Corea๋ ํญ์ ๋ ๋์ ๊ณณ์ ์งํฅํ๊ธฐ ๋๋ฌธ์, ์ผํฐ์ ๋์ฐฉํ๋ฉด ๊ทธ ์ผํฐ์ ์ง์ ์ฐ๊ฒฐ๋ ๋ ๋์ ์ผํฐ๋ก ํฅํ๋ ๊ธธ๋ค ์ค ํ๋๋ฅผ ๊ณจ๋ผ์ ๊ทธ ๊ธธ์ ๋ฐ๋ผ ์ด๋ํ๋ค. ๋ง์ฝ ๊ทธ๋ฐ ๊ธธ์ด ์๋ค๋ฉด ๋ฑ์ฐ์ ๋ง์น๋ค. ๊ด์ ์ฐ์ ์ผํฐ๋ค์๋ ์กฐ๊ตญ์ ๋ฏธ๋๋ฅผ ๋ณผ ์ ์๋ ์ ๋ง๋๊ฐ ํ๋์ฉ ์ค์น๋์ด ์๋ค. Corea๋ ์ต๋ํ ๋ง์ ์ผํฐ๋ฅผ ๋ฐฉ๋ฌธํด์ ์กฐ๊ตญ์ ๋ฏธ๋๋ฅผ ๋ง์ด ๋ณด๊ณ Unused์๊ฒ ์ ํด ์ฃผ๊ธฐ๋ก ํ๋ค. ๊ด์ ์ฐ์ ์ง๋๊ฐ ์ฃผ์ด์ง ๋, Corea๊ฐ ๊ฐ๊ฐ์ ์ผํฐ์์ ์ถ๋ฐํด์ ์ฐ์ ์ค๋ฅผ ๋ ์ต๋ ๋ช ๊ฐ์ ์ผํฐ๋ฅผ ๋ฐฉ๋ฌธํ ์ ์๋์ง ๊ตฌํ์ฌ๋ผ.
์ ๋ ฅ
์ฒซ ๋ฒ์งธ ์ค์ ๋ฑ์ฐ๋ก์ ์๋ ์ผํฐ์ ์ N(2 โค N โค 5, 000)๊ณผ ๋ ์ผํฐ ์ฌ์ด๋ฅผ ์ฐ๊ฒฐํ๋ ๊ธธ์ ์ M(1 โค M โค 100, 000)์ด ์ฃผ์ด์ง๋ค. ๋ ๋ฒ์งธ ์ค์๋ ๊ฐ ์ผํฐ์ ๋์ด๋ฅผ ๋ํ๋ด๋ N๊ฐ์ ์ ์๊ฐ ๋ฒํธ ์์๋๋ก ์ฃผ์ด์ง๋ค. ๊ฐ ์ผํฐ์ ๋์ด๋ 1 ์ด์ 1, 000, 000 ์ดํ์ด๋ฉฐ ์๋ก ๋ค๋ฅด๋ค. ์ธ ๋ฒ์งธ ์ค๋ถํฐ M๊ฐ์ ์ค์ ๊ฑธ์ณ ๊ฐ๊ฐ์ ๊ธธ์ด ์ฐ๊ฒฐํ๋ ๋ ์ผํฐ์ ๋ฒํธ๊ฐ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถ๋์ด ์ฃผ์ด์ง๋ค. ์ผํฐ์ ๋ฒํธ๋ 1 ์ด์ N ์ดํ์ ์ ์์ด๋ค. ์ ๋์ ์ด ๊ฐ์ ์ผํฐ์ธ ๊ธธ์ ์์ผ๋ฉฐ, ์์์ ๋ ์ผํฐ๋ฅผ ์ฐ๊ฒฐํ๋ ๊ธธ์ด ์ฌ๋ฌ ๊ฐ ์กด์ฌํ ์ ์๋ค.
์ถ๋ ฅ
N๊ฐ์ ์ค์ ๊ฑธ์ณ n๋ฒ์งธ ์ค์ Corea๊ฐ n๋ฒ ์ผํฐ์์ ์ถ๋ฐํด์ ์ฐ์ ์ค๋ฅผ ๋ ์ต๋๋ก ๋ฐฉ๋ฌธํ ์ ์๋ ์ผํฐ์ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ค.
์์
์ ๋ ฅ
5 5
3 1 6 4 7
1 4
2 1
3 4
4 2
5 1
์ถ๋ ฅ
3
4
1
2
1
My Sol
import sys
input = sys.stdin.readline
V, E = map(int, input().split())
hs = [0] + list(map(int, input().split()))
hs2 = []
for i, h in enumerate(hs):
hs2.append([h, i])
hs2.sort(reverse=True)
cnts = [0]*(V+1)
G = [set() for _ in range(V+1)]
for _ in range(E):
u, v = map(int, input().split())
if hs[u] > hs[v]:
u, v = v, u
G[u].add(v)
for i in range(V):
s = hs2[i][1]
max_cnt = 0
for k in G[s]:
max_cnt = max(max_cnt, cnts[k])
cnts[s] = max_cnt + 1
for i in range(1, V+1):
print(cnts[i])
DP๋ ์๋์ง๋ง, DP์ ๋ฐฉ์์ ์ผ๋ถ ํ์ฉํด์ ์ค๋ณต ๊ณ์ฐ์ ์ค์๋ค. ๋์ด๊ฐ ๋์ ์์ผ๋ก ์ ๋ ฌํด์ ํด๋น ์ผํฐ๋ณด๋ค ๋์ ์์น์ ์ธ์ ํ ์ผํฐ ์ค ๋์ ๋ ์ด๋ ๊ฐ๋ฅ ์ผํฐ ๊ฐ์์ ์ต๋๊ฐ์ ๊ณ์ฐํ๊ณ ์ด์ ์๊ธฐ ์์ ์ธ 1์ ๋ํด cnts์ ์ ์ฅํ๋ ๋ฐฉ์์ด๋ค.
์ด๋ฅผ ํตํด ์๋์ ์๋ ์ผํฐ๋ ์๋ก ์ฐ๊ฒฐ๋ ์ผํฐ๋ง๋ค ๋งค๋ฒ ์ด๋ ๊ฒฝ๋ก๋ฅผ ๊ณ์ฐํ ํ์๊ฐ ์์ด์ง๋ค.
๊ฒฐ๊ณผ
๋ง์์ต๋๋ค!!
๋๊ธ๋จ๊ธฐ๊ธฐ