Devvy-Is-Free
[Python] softeer.ai ์ง๊ฒ๋ค๋ฆฌ2 ๋ณธ๋ฌธ
๐ต์ค๋์ ๋ต๊ณก๐ต
- ์ํฐ์คํธ
- 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)
'Programming > Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [Python] softeer.ai ์ฐ๋ฌผ ์ ๊ฐ๊ตฌ๋ฆฌ (0) | 2022.10.03 |
|---|---|
| [Python] softeer.ai ๊ฐ์์ค ๋ฐฐ์ (0) | 2022.09.27 |
| [Python] softeer.ai ๋ฐ์ด๋ฌ์ค / ์ํผ๋ฐ์ด๋ฌ์ค (0) | 2022.09.24 |
| [Python] softeer.ai ์ง๊ฒ๋ค๋ฆฌ (0) | 2022.09.20 |
| [Python] softeer.ai ์ฑ์ ํ๊ท (0) | 2022.09.20 |