[BOJ][๐ŸŸก5][๋ฐฑ์ค€#14699] ๊ด€์•…์‚ฐ ๋“ฑ์‚ฐ

์ž‘์„ฑ:    

์—…๋ฐ์ดํŠธ:

์นดํ…Œ๊ณ ๋ฆฌ:

ํƒœ๊ทธ: , , ,

๋ฌธ์ œ ์ถœ์ฒ˜

BAEKJOON Online Judge #14699


๋ฌธ์ œ

์„œ์šธ๋Œ€ํ•™๊ต์—๋Š” โ€œ๋ˆ„๊ฐ€ ์กฐ๊ตญ์˜ ๋ฏธ๋ž˜๋ฅผ ๋ฌป๊ฑฐ๋“  ๊ณ ๊ฐœ๋ฅผ ๋“ค์–ด ๊ด€์•…์„ ๋ณด๊ฒŒ ํ•˜๋ผโ€๋ผ๋Š” ์œ ๋ช…ํ•œ ๋ฌธ๊ตฌ๊ฐ€ ์žˆ๋‹ค. ์–ด๋Š ๋‚  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์— ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

์ด๋ฅผ ํ†ตํ•ด ์•„๋ž˜์— ์žˆ๋Š” ์‰ผํ„ฐ๋Š” ์œ„๋กœ ์—ฐ๊ฒฐ๋œ ์‰ผํ„ฐ๋งˆ๋‹ค ๋งค๋ฒˆ ์ด๋™ ๊ฒฝ๋กœ๋ฅผ ๊ณ„์‚ฐํ•  ํ•„์š”๊ฐ€ ์—†์–ด์ง„๋‹ค.


๊ฒฐ๊ณผ

๋งž์•˜์Šต๋‹ˆ๋‹ค!!

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ