Devvy-Is-Free

[Python] softeer.ai ์ง•๊ฒ€๋‹ค๋ฆฌ2 ๋ณธ๋ฌธ

Programming/Algorithm

[Python] softeer.ai ์ง•๊ฒ€๋‹ค๋ฆฌ2

Devvy 2022. 9. 11. 22:19

๐ŸŽต์˜ค๋Š˜์˜ ๋ต๊ณก๐ŸŽต

 
After LIKE
์•„ํ‹ฐ์ŠคํŠธ
IVE (์•„์ด๋ธŒ)
์•จ๋ฒ”
After LIKE
๋ฐœ๋งค์ผ
2022.08.22

์ตœ์žฅ ์ฆ๊ฐ€ ๋ถ€๋ถ„ ์ˆ˜์—ด(LIS : Longest Increasing Subsequence)

- ๋™์  ๊ณ„ํš๋ฒ•

์–ด๋–ค ์ž„์˜์˜ ์ˆ˜์—ด์ด ์ฃผ์–ด์งˆ ๋•Œ, ์ด ์ˆ˜์—ด์—์„œ ๋ช‡ ๊ฐœ์˜ ์ˆ˜๋“ค์„ ์ œ๊ฑฐํ•ด์„œ ๋ถ€๋ถ„ ์ˆ˜์—ด์„ ๋งŒ๋“ฆ
๋งŒ๋“ค์–ด์ง„ ๋ถ€๋ถ„ ์ˆ˜์—ด ์ค‘ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ๋œ ๊ฐ€์žฅ ๊ธด ์ˆ˜์—ด์„ ์ตœ์žฅ ์ฆ๊ฐ€ ๋ถ€๋ถ„ ์ˆ˜์—ด

 

์ฒซ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•

์‹œ๊ฐ„ ๋ณต์žก๋„ : O(N^2)

 

์›๋ณธ ๋ฐฐ์—ด A, ์ƒˆ๋กœ์šด ๋ฐฐ์—ด B ์„ ์–ธ

int A[8] = {3, 5, 7, 9, 2, 1, 4, 8};


B[i] : A [i]๋ฅผ ๋งˆ์ง€๋ง‰ ๊ฐ’์œผ๋กœ ๊ฐ€์ง€๋Š” ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ๊ธธ์ด

 

i = 0

A[0] = 0 , B[0] = 0

i 0 1 2 3 4 5 6 7 8
A 0 3 5 7 9 2 1 4 8
B 0  


i = 1

A[1] = 3, 3์€ A[0] = 0 ๋’ค์— ๊ฐ€๋Šฅ -> B[1] = B[0] + 1 = 1

i 0 1 2 3 4 5 6 7 8
A 0 3 5 7 9 2 1 4 8
B 0 1  

 

i = 2

A[2] = 5 , A[0] = 0 ๊ณผ A[1] = 3 ๋‹ค์Œ์— ๊ฐ€๋Šฅ -> B[2] = B[1] + 1 = 2

i 0 1 2 3 4 5 6 7 8
A 0 3 5 7 9 2 1 4 8
B 0 1 2  

 

i = 3

A[3] = 7 , A[0] = 0 ๊ณผ A[1] = 3๊ณผ A[2] = 5 ๋‹ค์Œ์— ๊ฐ€๋Šฅ -> B[3] = B[2] + 1 = 3

i 0 1 2 3 4 5 6 7 8
A 0 3 5 7 9 2 1 4 8
B 0 1 2 3  

 

i = 4

A[4] = 9 , A[0] = 0๊ณผ A[1] = 3 ๊ณผ A[2] = 5๊ณผ A[3] = 7 ๋‹ค์Œ์— ๊ฐ€๋Šฅ -> B[4] = B[3] + 1 = 4

i 0 1 2 3 4 5 6 7 8
A 0 3 5 7 9 2 1 4 8
B 0 1 2 3 4  

 

 

i = 5

A[5] = 2 , A[0] = 0 ๋‹ค์Œ์— ๊ฐ€๋Šฅ -> B[5] = B[0] + 1 = 1

i 0 1 2 3 4 5 6 7 8
A 0 3 5 7 9 2 1 4 8
B 0 1 2 3 4 1  

 

i = 6

A[6] = 1 , A[0] = 0 ๋‹ค์Œ์— ๊ฐ€๋Šฅ -> B[6] = B[0] + 1 = 1

i 0 1 2 3 4 5 6 7 8
A 0 3 5 7 9 2 1 4 8
B 0 1 2 3 4 1 1  

 

i = 7

A[7] = 4 , A[0] = 0๊ณผ A[1] = 3 ๋‹ค์Œ์— ๊ฐ€๋Šฅ -> B[7] = B[1] + 1 = 2

i 0 1 2 3 4 5 6 7 8
A 0 3 5 7 9 2 1 4 8
B 0 1 2 3 4 1 1 2  

 

i = 8

A[8] = 8 , A[0] = 0๊ณผ A[1] = 3๊ณผ A[2] = 5๊ณผ A[3] = 7 ๋‹ค์Œ์— ๊ฐ€๋Šฅ -> B[8] = B[3] + 1 = 4

i 0 1 2 3 4 5 6 7 8
A 0 3 5 7 9 2 1 4 8
B 0 1 2 3 4 1 1 2 4

 

๊ฒฐ๋ก  : B์˜ ๋ฐฐ์—ด์—์„œ ๊ฐ€์žฅ ํฐ ๊ฐ’(B[4] = B[8] = 4)์ด ์ˆ˜์—ด A์˜ LIS์˜ ๊ธธ์ด

 

N๊ฐœ์˜ ์ˆ˜๋“ค์— ๋Œ€ํ•ด ์ž๊ธฐ ์ž์‹  ์ „์˜ ๋ชจ๋“  ์ˆ˜๋ฅผ ํ›‘์–ด๋ด์•ผ ํ•˜๋ฏ€๋กœ O(N^2)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ€์ง

 

 

๋‘ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•

์‹œ๊ฐ„ ๋ณต์žก๋„ : O(NlogN)

 

์›๋ณธ ๋ฐฐ์—ด A, ์ƒˆ๋กœ์šด ๋ฐฐ์—ด B ์„ ์–ธ

int A[8] = {3, 5, 7, 9, 2, 1, 4, 8};


B[i] : A [i]๋ฅผ ๋งˆ์ง€๋ง‰ ๊ฐ’์œผ๋กœ ๊ฐ€์ง€๋Š” ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ๊ธธ์ด

โœจA[i]๋ณด๋‹ค ์ž‘์€ A[j]๋ฅผ ๊ฐ€์ง€๋Š” j๋“ค ์ค‘ ๊ฐ€์žฅ ํฐ B[j]๋ฅผ ์ฐพ๊ธฐโœจ

โœจA[i]๋ณด๋‹ค ์ž‘์€ A[j]๋ฅผ ๊ฐ€์ง€๋Š” j๋“ค ์ค‘ ๊ฐ€์žฅ ํฐ B[j]๋ฅผ ์ฐพ๊ธฐโœจ

 

i 0 1 2 3 4 5 6 7 8
A 0 3 5 7 9 2 1 4 8
B 0  

B[i] = k ์ธ ๊ฐ’๋“ค ์ค‘ A[i]์˜ ๊ฐ’์ด ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์„ ์ €์žฅ

B[i] 0
A[i] 0

 

i = 1

A[1] = 3 , A[1] ์•ž์˜ ์ˆ˜๋“ค ์ค‘ ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€๋ถ€๋ถ„์ˆ˜์—ด ์ค‘ ๋งˆ์ง€๋ง‰ ๊ฐ’์ด 0 ์ด๋ฏ€๋กœ ๋‹ค์Œ์— ๊ฐ€๋Šฅ -> B[1] = 0 + 1 = 1

i 0 1 2 3 4 5 6 7 8
A 0 3 5 7 9 2 1 4 8
B 0 1  
B[i] 0 1
A[i] 0 3

 

i = 2

A[2] = 5 , ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ A[i]์˜ ๊ฐ’์ด 3์ด๋ฏ€๋กœ ๋‹ค์Œ์— ๊ฐ€๋Šฅ -> B[2] = B[1] + 1 = 2

i 0 1 2 3 4 5 6 7 8
A 0 3 5 7 9 2 1 4 8
B 0 1 2  
B[i] 0 1 2
A[i] 0 3 5

 

 

i = 3

A[3] = 7 ,  ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ๊ฐ’์ด 5์ด๋ฏ€๋กœ ๋‹ค์Œ์— ๊ฐ€๋Šฅ -> B[3] = B[2] + 1 = 3

i 0 1 2 3 4 5 6 7 8
A 0 3 5 7 9 2 1 4 8
B 0 1 2 3  
B[i] 0 1 2 3
A[i] 0 3 5 7

 

i = 4

A[4] = 9 , ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ๊ฐ’์ด 7์ด๋ฏ€๋กœ ๋‹ค์Œ์— ๊ฐ€๋Šฅ -> B[4] = B[3] + 1 = 4

i 0 1 2 3 4 5 6 7 8
A 0 3 5 7 9 2 1 4 8
B 0 1 2 3 4  
B[i] 0 1 2 3 4
A[i] 0 3 5 7 9

 

i = 5

A[5] = 2 , 2๋Š” A[i]์—์„œ 0๊ณผ 3 ์‚ฌ์ด์˜ ๊ฐ’์ด๋ฏ€๋กœ B[5] = 0 + 1 = 1

A[i]์€ 3๋ณด๋‹ค ๋” ์ž‘์€ 2๋กœ ๊ฐฑ์‹  -> B[i] = 2์ธ ์ˆ˜์—ด์„ ์ฐพ๊ธฐ ์œ„ํ•ด์„œ A[5] = 2 ๋’ค์— ๋ถ™์ผ ์ˆ˜ ์žˆ๋Š”์ง€๋งŒ ํ™•์ธํ•˜๋ฉด ๋จ

i 0 1 2 3 4 5 6 7 8
A 0 3 5 7 9 2 1 4 8
B 0 1 2 3 4 1  
B[i] 0 1 2 3 4
A[i] 0 2 5 7 9

 

i = 6

A[6] = 1 , 1์€ A[i]์—์„œ 0๊ณผ 2 ์‚ฌ์ด์˜ ๊ฐ’์ด๋ฏ€๋กœ B[6] = 0 + 1 = 1

A[i]์€ 2๋ณด๋‹ค ๋” ์ž‘์€ 1๋กœ ๊ฐฑ์‹ 

i 0 1 2 3 4 5 6 7 8
A 0 3 5 7 9 2 1 4 8
B 0 1 2 3 4 1 1  
B[i] 0 1 2 3 4
A[i] 0 1 5 7 9

 

i = 7

A[7] = 4 , 4๋Š” A[i]์—์„œ 1๊ณผ 5 ์‚ฌ์ด์˜ ๊ฐ’์ด๋ฏ€๋กœ B[7] = 1 + 1 = 2

A[i]์€ 5๋ณด๋‹ค ๋” ์ž‘์€ 4๋กœ ๊ฐฑ์‹ 

i 0 1 2 3 4 5 6 7 8
A 0 3 5 7 9 2 1 4 8
B 0 1 2 3 4 1 1 2  
B[i] 0 1 2 3 4
A[i] 0 1 4 7 9

 

i = 8

A[8] = 8 , 8์€ A[i]์—์„œ 7๊ณผ 9 ์‚ฌ์ด์˜ ๊ฐ’์ด๋ฏ€๋กœ B[8] = 3 + 1 = 4

A[i]์€ 9๋ณด๋‹ค ๋” ์ž‘์€ 8๋กœ ๊ฐฑ์‹ 

i 0 1 2 3 4 5 6 7 8
A 0 3 5 7 9 2 1 4 8
B 0 1 2 3 4 1 1 2 4
B[i] 0 1 2 3 4
A[i] 0 1 4 7 8

 

๊ฒฐ๋ก  : B์˜ ๋ฐฐ์—ด์—์„œ ๊ฐ€์žฅ ํฐ ๊ฐ’(B[4] = B[8] = 4)์ด ์ˆ˜์—ด A์˜ LIS์˜ ๊ธธ์ด

 

N๊ฐœ์˜ ์ˆ˜๋“ค์— ๋Œ€ํ•ด ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ๋œ ๋ฐ‘์˜ ํ…Œ์ด๋ธ”์„ ๋น„๊ตํ•˜๋ฏ€๋กœ ์ด์ง„ํƒ์ƒ‰ ์‚ฌ์šฉ -> O(NlogN)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ€์ง

 

(โ—'โ—ก'โ—)์ •๋‹ต์ฝ”๋“œ(โ—'โ—ก'โ—)

import sys
import bisect

N = int(sys.stdin.readline())
stone = list(map(int, sys.stdin.readline().split()))

# ๋ฐŸ์„ ์ˆ˜ ์žˆ๋Š” ๋Œ์˜ ๋†’์ด DP ๋ฐฐ์—ด
B = [stone[0]] # ์›๋ณธ ์ค‘ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’(์•ž์—์„œ๋ถ€ํ„ฐ)
C = [stone[-1]] # ์›๋ณธ ์ค‘ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’(๋’ค์—์„œ๋ถ€ํ„ฐ)
B_c = [1] * N # ์•ž์—์„œ๋ถ€ํ„ฐ ๋ฐŸ์€ ๋Œ์˜ ๊ฐœ์ˆ˜
C_c = [1] * N # ๋’ค์—์„œ๋ถ€ํ„ฐ ๋ฐŸ์€ ๋Œ์˜ ๊ฐœ์ˆ˜

# ์•ž์—์„œ๋ถ€ํ„ฐ
for i in range(N):
    # ๋†’์ด๊ฐ€ ๋” ์˜ฌ๋ผ๊ฐ”์œผ๋ฉด
    if stone[i] > B[-1]:
        B.append(stone[i])
    # ๋†’์ด๊ฐ€ ๋” ๋‚ฎ์•„์กŒ์œผ๋ฉด
    else:
        # ์ด๋ถ„ํƒ์ƒ‰์œผ๋กœ ํ˜„์žฌ ๋†’์ด๋ณด๋‹ค ๋” ์ž‘์€, ๊ฐ€์žฅ ํฐ ๋†’์ด์˜ index
        # bisect_left(a, x) : ์ •๋ ฌ๋œ a์— x๋ฅผ ์‚ฝ์ž…ํ•  ์œ„์น˜ ๋ฆฌํ„ด
        # bisect_left(a, x) : ๊ทธ ์œ„์น˜์˜ ์˜ค๋ฅธ์ชฝ ์œ„์น˜ ๋ฆฌํ„ด
        index = bisect.bisect_left(B, stone[i])
        B[index] = stone[i]

    B_c[i] = len(B)

# ๋’ค์ชฝ๋ถ€ํ„ฐ์ธ๋ฐ ํŽธํ•˜๊ฒŒ reverse
stone.reverse()

for i in range(N):
    # ๋†’์ด๊ฐ€ ๋” ์˜ฌ๋ผ๊ฐ”์œผ๋ฉด
    if stone[i] > C[-1]:
        C.append(stone[i])
    # ๋†’์ด๊ฐ€ ๋” ๋‚ฎ์•„์กŒ์œผ๋ฉด
    else:
        # ์ด๋ถ„ํƒ์ƒ‰์œผ๋กœ ํ˜„์žฌ ๋†’์ด๋ณด๋‹ค ๋” ๋‚ฎ์€, ๊ทธ ์ค‘์—์„œ ๊ฐ€์žฅ ํฐ ๋†’์ด์˜ index
        index = bisect.bisect_left(C, stone[i])
        C[index] = stone[i]
    
    C_c[N - i - 1] = len(C)

sum = 0
for i in range(N):
    # ์–‘ ๋ฐฉํ–ฅ์—์„œ ๋Œ์„ ๊ฑด๋„ ๋•Œ, ๊ทธ ํ•ฉ์˜ ์ตœ๋Œ€์ธ ๊ฒƒ
    sum = max(sum, B_c[i] + C_c[i])

# ๊ฐ€์žฅ ๋†’์€ ์œ„์น˜์˜ ๋Œ์„ ๋ฐŸ์•˜์„ ๋•Œ ๊ฒน์น˜๊ธฐ ๋•Œ๋ฌธ์— -1
print(sum - 1)