[BOJ][๐ŸŸก2][๋ฐฑ์ค€#01324] ์  ์žฅ

์ž‘์„ฑ:    

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

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

ํƒœ๊ทธ: , , ,

๋ฌธ์ œ ์ถœ์ฒ˜

BAEKJOON Online Judge #1324


๋ฌธ์ œ

๋‹น์‹ ์€ ๊ฒŒ์ž„์„ ํ•˜๋‹ค ๊ฑธ๋ ค์„œ ์‚ฌํšŒ๋ด‰์‚ฌ๋ฅผ ํ•ด์•ผ ํ•œ๋‹ค. ๋‹น์‹ ์€ 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๋ฅผ ์ด์šฉํ•œ๋‹ค.

  1. ์ž…๋ ฅ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.
  2. Day1์„ ๊ธฐ์ค€์œผ๋กœ ์ด ๋‚  ์“ฐ๋ ˆ๊ธฐ๋ฅผ ์ฃผ์šธ์ง€, ์ค์ง€ ์•Š์„์ง€์— ๋”ฐ๋ผ DP๊ฐ€ ํ™•์žฅ๋˜๋Š” ๋ฐฉ์‹์ด๋‹ค.
  3. ๋งŒ์•ฝ Day1์˜ ์–ด๋– ํ•œ ๋‚ ์ด Day2์˜ ์“ฐ๋ ˆ๊ธฐ ๋ฆฌ์ŠคํŠธ์— ์—†๋‹ค๋ฉด ์ฃผ์›Œ๋„ ์˜๋ฏธ๊ฐ€ ์—†์œผ๋ฏ€๋กœ continue
  4. ์ด์ „๊นŒ์ง€ ์ฃผ์šธ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜ ์ค‘ ret[i-1]์—์„œ ๊ฐ€์ ธ์™”๊ณ , ์ด๋ฅผ ํ•˜๋‚˜ํ•˜๋‚˜ ๊นŒ๋ณธ๋‹ค.
  5. Day1์˜ ํŠน์ • ์“ฐ๋ ˆ๊ธฐ๋ฅผ ์ฃผ์› ์„ ๊ฒฝ์šฐ ์ด์ „๊นŒ์ง€์˜ ์“ฐ๋ ˆ๊ธฐ๋ฅผ ์ค๋Š” ๊ฒฝ์šฐ์—์„œ ์ด๋ณด๋‹ค ๊ฐ™๊ฑฐ๋‚˜ ํฐ ์“ฐ๋ ˆ๊ธฐ๋ฅผ ์ฃผ์› ๋‹ค๋ฉด continue
  6. ํ˜„์žฌ๊นŒ์ง€์˜ ์“ฐ๋ ˆ๊ธฐ ํฌ๊ธฐ๊ฐ€ ํ˜„์žฌ ์“ฐ๋ ˆ๊ธฐ๋ณด๋‹ค ์ž‘์€ ๊ฒฝ์šฐ ์ง์ „์˜ ์“ฐ๋ ˆ๊ธฐ๋ฅผ ์ฃผ์šด ๋‚  ์ดํ›„๋กœ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋‚ ์˜ ์ธ๋ฑ์Šค๋ฅผ ์ž„์‹œ set์ธ add_list์— ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.
  7. ๊ฐ™์€ ์“ฐ๋ ˆ๊ธฐ์˜ ๊ฐœ์ˆ˜๋ผ๋ฉด ๋” ์ž‘์€ ์“ฐ๋ ˆ๊ธฐ, ๋” ๋นจ๋ฆฌ ์ฃผ์šธ์ˆ˜๋ก ์ด๋“์ด๋ฏ€๋กœ ๊ทธ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ค˜ ์ตœ์ ์˜ ์“ฐ๋ ˆ๊ธฐ๋ฅผ ret[i]์— ๋„ฃ๋Š”๋‹ค.
  8. ์ด๋ ‡๊ฒŒ ๋œ๋‹ค๋ฉด ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ set์ด ๋งŽ์•„์ง€๋ฏ€๋กœ 10๊ฐœ ๋‹จ์œ„๋งˆ๋‹ค ์ตœ์ ์˜ ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€๋ฅผ ์ œ๊ฑฐํ•ด์ค€๋‹ค.
  9. ๋งˆ์ง€๋ง‰ 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์ด๊ณ , ์ฝ”๋“œ ์–‘๋„ ์ ˆ๋ฐ˜ ์ˆ˜์ค€์ด๋‹ค.

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