๐Ÿ—๏ธ Algorithm/๐ŸŸฉ ๋ฐฑ์ค€

๐ŸŸฉ [๋ฐฑ์ค€] [Python] [Gold2] 12015๋ฒˆ_๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด 2

Dbswnstjd 2023. 5. 12. 16:42

๋ฌธ์ œ

https://www.acmicpc.net/problem/12015

 

12015๋ฒˆ: ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด 2

์ฒซ์งธ ์ค„์— ์ˆ˜์—ด A์˜ ํฌ๊ธฐ N (1 ≤ N ≤ 1,000,000)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„์—๋Š” ์ˆ˜์—ด A๋ฅผ ์ด๋ฃจ๊ณ  ์žˆ๋Š” Ai๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (1 ≤ Ai ≤ 1,000,000)

www.acmicpc.net

ํ’€์ด

# ๋ฐฑ์ค€ 12015๋ฒˆ ๋ฌธ์ œ - ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด
n = int(input())
arr = list(map(int, input().split()))
stack = [0]
def binary_search(target, start, end):
    while start <= end:
        mid = (start + end) // 2

        if stack[mid] < target:
            start = mid + 1
        else:
            end = mid - 1
    return start

for i in arr:
    if stack[-1] < i:
        stack.append(i)
    else:
        stack[binary_search(i, 0, len(stack) - 1)] = i
print(len(stack) - 1) # 0์„ ๋นผ์•ผํ•˜๋ฏ€๋กœ -1

์ฒ˜์Œ ํ’€์—ˆ์„ ๋•Œ LIS ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•  ๋•Œ ๋‘๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋Š” ์ค„ ๋ชฐ๋ž๋‹ค. 

๋‚˜๋Š” DP๋กœ๋งŒ ์ƒ๊ฐํ•˜๋‹ค๊ฐ€ ์ด๋ถ„ํƒ์ƒ‰์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋ผ๊ณ ๋Š” ์ƒ๊ฐํ•˜์ง€ ๋ชปํ•ด์„œ ํ’€์ง€ ๋ชปํ•˜์˜€๋‹ค. 

 

์ˆ˜์—ด์˜ ๊ธธ์ด๋งŒ ๊ตฌํ•˜๋ฉด ๋˜๋ฏ€๋กœ ์ด๋ถ„ํƒ์ƒ‰์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

์Šคํƒ์„ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์Šคํƒ์˜ ๋งจ ๋งˆ์ง€๋ง‰ ๊ฐ’์ด i ๋ณด๋‹ค ์ž‘๋‹ค๋ฉด ์‚ฝ์ž…ํ•˜๊ณ  ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด

์Šคํƒ์˜ ์ธ๋ฑ์Šค๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด ์ด๋ถ„ํƒ์ƒ‰์„ ํ•˜๊ณ  ์ธ๋ฑ์Šค์˜ ๊ฐ’์„ ๊ฒฐ๊ณผ๊ฐ’์œผ๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ๋ฉด ๋œ๋‹ค.