๊ธฐ์ด ์๊ณ ๋ฆฌ์ฆ๋ถํฐ ์ฌํ๊น์ง ์ด๋ก ์ ๋ฆฌ ๋ฐ ๋ฌธ์ ํ์ด๋ฅผ ์ ๋ก๋ํ๋ ์ ์ฅ์
์ซ์๋ก ์์ํ๋ ๋ฌธ์ ๋ Leet Code๋ฌธ์
๋ฌธ์๋ก ์์ํ๋ ๋ฌธ์ ๋ ๋ฐฑ์ค ๋ฌธ์ ์ด๋ค. (G4_5052_์ ํ๋ฒํธ๋ชฉ๋ก์ Gold4 ๋ ๋ฒจ์ 5052๋ฒ ๋ฌธ์ ๋ผ๋ ๋ป)
์ฐธ๊ณ ์๋ฃ
- ์ด๊ฒ์ด ์ทจ์ ์ ์ํ ์ฝ๋ฉ ํ ์คํธ๋ค with ํ์ด์ฌ - ๋๋๋น
- ํ์ด์ฌ ์๊ณ ๋ฆฌ์ฆ ์ธํฐ๋ทฐ - ๋ฐ์๊ธธ
- ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ํด๊ฒฐ ์ ๋ต - ๊ตฌ์ข ๋ง
[TOC]
์ ์ถ๋ ฅ
- ์
๋ ฅ๋๋ ๋ฐ์ดํฐ๊ฐ ๋ง์ ๊ฒฝ์ฐ
sys.stdin.readline()์ด์ฉinput()๊ณผ ๊ฑฐ์ ๋์ผํ๊ฒ ์ด์ฉํ ์ ์์split()์ ์ด์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ์๋๋ฉด ์ค๋ฅธ์ชฝ์ ์ค ๋ฐ๊ฟ ๊ธฐํธ๊ฐ ๋จ์ผ๋sys.stdin.readline().rstrip()ํ์
ํ์ด์ฌ ๋ฌธ์์ด ์ฒ๋ฆฌ ๊ด๋ จ ํจ์
- ๋๋ฌธ์, ์๋ฌธ์
string.upper(): ๋๋ฌธ์๋ก ๋ณํstring.lower(): ์๋ฌธ์๋ก ๋ณํ
- ๋ฌธ์ ํ๋
char.isalnum(): char๊ฐ ์๋ฌธ์ ํน์ ์ซ์์ผ ๊ฒฝ์ฐ True, ์๋๋ฉด False ๋ฐํchar.isdigit(): ์ซ์๋ฉด True
- ๋ฌธ์์ด ๋ฐ๊พธ๊ธฐ
string.replace(string1, string2): ๋ฌธ์์ด ๋ด์ ๋ฌธ์์ด1์ ๋ฌธ์์ด2๋ก ๋ณํ- ์ผ๋ถ ๊ธ์๋ฅผ ๋ฐ๊พธ๊ฑฐ๋ ์ญ์ ํ ์ ์๊ณ , ๊ณต๋ฐฑ์ ์์ ๋ ๋ฐ ํธ๋ฆฌํจ
- ๋ณํํ๋ฉด string์ด ๋ฐ๋๋ ๊ฒ์ด ์๋๋ผ ์๋ก์ด ๋ฌธ์์ด์ ๋ฆฌํดํจ
- ๋ฌธ์์ด ์ฐพ๊ธฐ
string.find(word): ์ฐพ๋ ๋ฌธ์์ด์ด ์ฒ์ ๋์ค๋ ์์น ๋ฆฌํด, ์์ผ๋ฉด -1 ๋ฆฌํดstring.count(word): ํด๋น ๋ฌธ์์ด์ ๊ฐฏ์๋ฅผ ๋ฆฌํด
- ๋ฌธ์์ด ์ฌ๋ผ์ด์ฑ
string[start:end]: start์์ end-1๋ฒ ์ธ๋ฑ์ค์ ํด๋นํ๋ ๋ฌธ์์ด์ ์ถ์ถstring[::2](2๊ฐ์ฉ ๊ฑด๋๋ฐ๋ฉฐ ์ถ์ถ),string[::-1](๋ค์์๋ถํฐ ์ถ๋ ฅ)
- ๋ฌธ์์ด ๋ถ๋ฆฌ, ๊ฒฐํฉ
string.split(word): word๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ถ๋ฆฌ"word".join(string): string์ ๊ฐ ์์ ์ฌ์ด์ word๋ฅผ ์ฝ์
- ๋ฌธ์์ด ๊ณต๋ฐฑ ์ ๊ฑฐ
string.strip(): ์์ชฝ ๊ณต๋ฐฑ ์ ๊ฑฐstring.lstrip(): ์ผ์ชฝ ๊ณต๋ฐฑ ์ ๊ฑฐstring.rstrip(): ์ค๋ฅธ์ชฝ ๊ณต๋ฐฑ ์ ๊ฑฐstring.strip(letter): ์์ชฝ์์ letter๊ฐ ๋์ค์ง ์์ ๋๊น์ง ์ ๊ฑฐstring.lstrip(letter): ์ผ์ชฝ์์ letter๊ฐ ๋์ค์ง ์์ ๋๊น์ง ์ ๊ฑฐstring.rstrip(letter): ์ค๋ฅธ์ชฝ์์ letter๊ฐ ๋์ค์ง ์์ ๋๊น์ง ์ ๊ฑฐstring.strip(ab): ์์ชฝ์์ a ๋๋ b๊ฐ ๋์ค์ง ์์ ๋๊น์ง ์ ๊ฑฐ
- ์์คํค ์ฝ๋ ๊ด๋ จ
chr(num): ์์คํค ์ฝ๋๋ฅผ ์ ๋ ฅ๋ฐ์ ๋ฌธ์๋ฅผ ์ถ๋ ฅord(letter): ๋ฌธ์๋ฅผ ์ ๋ ฅ๋ฐ์ ์์คํค ์ฝ๋๋ฅผ ์ถ๋ ฅ
๋ฆฌ์คํธ ๊ด๋ จ ํจ์
list.reverse(): ๋ฆฌ์คํธ๋ฅผ ๋ค์ง์ด์ค- ๋ฆฌํด ๊ฐ ์์ด ๋ฆฌ์คํธ ๋ด๋ถ์์ ์คํ๋๊ณ , ์์๊ฐ ์์ ๊ฒฝ์ฐ ์๋ฌ ๋ฐ์
list[::-1]๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ํ๋๋ฐ, ์ด ์ชฝ์ด ๋น ๋ฅด๋ค๊ณ ํจ
list.insert(index, x): list ๋ฆฌ์คํธ์ index์ x๋ฅผ ์ฝ์ ํจdel list[index]: list ๋ฆฌ์คํธ์ index๋ฒ ์งธ ์์๋ฅผ ์ญ์ ํจ- ๋ฆฌ์คํธ๋ enumerate๋ฅผ ์ง์ํจ
for i, n in enumerate(list)ํ๋ฉด ์์ ์ธ๋ฑ์ค, ๋ค๋ ๊ฐ์ด ๋จ
๋์ ๋๋ฆฌ ๊ด๋ จ
-
defaultdict
- ์กด์ฌํ์ง ์๋ ํค๋ฅผ ์กฐํํ ๊ฒฝ์ฐ ํด๋น ํค์ ๋ํ ๋์
๋๋ฆฌ ์์ดํ
์ "๊ธฐ๋ณธ๊ฐ์ ๊ธฐ์ค์ผ๋ก " ์์ฑํจ
-
์ผ๋ฐ ๋์ ๋๋ฆฌ๋ ์๋ฌ๋ฉ์ธ์ง๋ฅผ ๋ฐํ
-
๊ธฐ๋ณธ๊ฐ์ int ๊ธฐ์ค 0์
-
counts = collections.defaultdict(int) for word in words: counts[word] += 1
-
- ์กด์ฌํ์ง ์๋ ํค๋ฅผ ์กฐํํ ๊ฒฝ์ฐ ํด๋น ํค์ ๋ํ ๋์
๋๋ฆฌ ์์ดํ
์ "๊ธฐ๋ณธ๊ฐ์ ๊ธฐ์ค์ผ๋ก " ์์ฑํจ
-
Counter
-
์์ดํ ์ ๊ฐฏ์๋ฅผ ๊ณ์ฐํด ๋์ ๋๋ฆฌ๋ก ๋ฆฌํดํจ
-
a = [1, 2, 3, 4, 5, 5, 5, 6, 6] b = collections.Counter(a) # b๋ {5: 3, 6: 2, 1: 1, 2: 1, 3: 1, 4: 1}
-
b.most_common(2)๋ฅผ ํ๋ฉด b์์ ๊ฐ์ฅ ๋น๋๊ฐ ๋์ 2๊ฐ์ ์์ (5, 3), (6, 2)๋ฅผ ๋ด์ ๋ฆฌ์คํธ๋ฅผ ๋ฐํํจ
-
-
get()
- key๋ฅผ ์ด์ฉํ์ฌ value๋ฅผ ์ป์
- key๊ฐ ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ ์๋ฌ๋ฉ์์ง๋ฅผ ๋ฐํํ๋๊ฒ ์๋๋ผ None์ ๋ฐํํ๋ค๋ ํน์ง์ด ์์
-
values()
- ๋์ ๋๋ฆฌ์ ๊ฐ๋ค์ ๋ฌถ์ด์ ๋ฐํ
- list() ์์ ๋ฃ์ด์ฃผ๋ฉด ๋ฆฌ์คํธ ํํ๋ก ๋ฐ์ ์ ์์
ํ์ด์ฌ ๊ธฐ๋ณธ ํจ์
-
max()- key์ ๋ค์ด๊ฐ๋ ํจ์๋ฅผ ํ์ฉํ์ฌ ํด๋น ํจ์๋ฅผ ์ฒ๋ฆฌํ ๊ฒฐ๊ณผ ์ค ์ต๋๊ฐ์ ๊ตฌํ ์ ์์
- ์)
max([1, 0, -2, 3, -5], key=abs): ์ ๋๊ฐ ๊ธฐ์ค์ผ๋ก ์ฐพ๊ธฐ ๋๋ฌธ์ -5๊ฐ ๋์ด - ์2)
max(counts, key=counts.get): ๋์ ๋๋ฆฌ counts ์ค value๊ฐ ๊ฐ์ฅ ํฐ ๊ฒ์ ํค๋ฅผ ๊ตฌํ ์ ์์
-
zip()-
2๊ฐ ์ด์์ ์ํ์ค๋ฅผ ์งง์ ๊ธธ์ด๋ฅผ ๊ธฐ์ค์ผ๋ก 1๋1 ๋์ํ๋ ํํ ์ํ์ค๋ฅผ ๋ง๋ค์ด์ค
-
์์
-
a = [1, 2, 3, 4, 5] b = [2, 3, 4, 5] c = [3, 4, 5] # [(1, 2), (2, 3), (3, 4), (4, 5)] list(zip(a, b)) # [(1, 2, 3), (2, 3, 4), (3, 4, 5)] list(zip(a, b, c))
-
-
-
sort()- key ์ธ์์ ํจ์๋ฅผ ๋๊ฒจ์ฃผ๋ฉด ํด๋น ํจ์์ ๋ฐํ๊ฐ์ ๋น๊ตํ์ฌ ์์๋๋ก ์ ๋ ฌํจ
- ์์1) ๋๊ฐ์ ์์๋ฅผ ๊ฐ๋ ํํ๋ค์ 2๋ฒ์งธ ์์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๊ธฐ
list.sort(key = lambda x : x[1])
- ์์2) 2๋ฒ์งธ ์ดํ์ ์์๋ค๋ง ์ ๋ ฌํ๋ ์์๊ฐ ๊ฐ์ผ๋ฉด 1๋ฒ์งธ ์์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๊ธฐ
letters.sort(key = lambda x : (x.split()[1:], x.split()[0]))- ์์ ๊ฐ์ด ์ ๋ ฌ์ ์ฐ์ ์์๊ฐ ํ์ํ๋ฉด ํํ๋ก ์ง์ ํ ์ ์์
-
Asterisk
- Unpack์ ํด ์ฃผ๋ ์ฐ์ฐ์
- ์์
print(*fruits)๋ฅผ ํ์ฌ ๋ฆฌ์คํธ fruits์ ์๋ ์์๋ค์ ๊ตฌ๋ถํ์ฌ ํ ๋ฒ์ ์ถ๋ ฅlist(zip(*collections.Counter(nums).most_common(k))): ํํ์ด ๋ด๊ธด ๋ฆฌ์คํธ๋ฅผ ๋ฐํํ๋ most_common ํจ์์ ๊ฒฐ๊ณผ๊ฐ์ zip์ผ๋ก ๋ฌถ์ผ๋ฉด ํํ ๋ด๋ถ์ ๊ฐ๋ผ๋ฆฌ ๋ฌถ๋ ๊ฒ์ด ์๋๋ผ ํํ์ด ํต์ผ๋ก ๋์ค๊ธฐ ๋๋ฌธ์ ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์ด unpack์ ํด์ค ํ์ ๋ฌถ์
๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋?
- ๊ฐ ๋จ๊ณ์์ ๋ก์ปฌ ์ต์ ์ ์ ํ์ ํ์ฌ ๊ธ๋ก๋ฒ ์ต์ ์ ์ฐพ๋ ๊ฒ์ ๋ชฉํ๋ก ํ๋ ํด๊ฒฐ๋ฒ
- ์ต์ ํด๋ฅผ ์ฐพ์ง ๋ชปํ๋๋ผ๋ ์ด๋ ์ ๋ ๊ด์ฐฎ์ ํด๋ฅผ ์ฐพ์ ์ ์์
๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํ ์ ์๋ ๋ฌธ์
- ํ์ ์ ํ ์์ฑ์ ๊ฐ์ง
- ์์ ์ ํ์ด ์ดํ ์ ํ์ ์ํฅ์ ์ฃผ์ง ์๋ ๊ฒ
- ์ต์ ๋ถ๋ถ ๊ตฌ์กฐ
- ๋ฌธ์ ์ ์ต์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ๋ถ๋ถ ๋ฌธ์ ์ ๋ํ ์ต์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ผ๋ก ๊ตฌ์ฑ๋๋ ๊ฒฝ์ฐ
- DP๋ก ํด๊ฒฐํ ์ ์๋ ๋ฌธ์ ๋ ์ต์ ๋ถ๋ถ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง
DP์์ ๋น๊ต
- DP๋ ํ์ ๋ฌธ์ ์ ๋ํ ์ต์ ํด๋ฅผ ์ฐพ์ ์ด๋ฅผ ๊ฒฐํฉํด Globally Optimum Solution์ ์ฐพ์
- ๊ทธ๋ฆฌ๋๋ ๊ฐ ๋จ๊ณ๋ง๋ค ๋ก์ปฌ ์ต์ ํด๋ฅผ ์ฐพ์ ๋ฌธ์ ๋ฅผ ์๊ฒ ์ค์ฌ๋๊ฐ
๋ฐฐ๋ญ์ ๋ด์ ์ ์๋ ๋ฌด๊ฒ์ ์ต๋๊ฐ์ด ์ ํด์ ธ ์๊ณ , ์ง์ ๊ฐ์น์ ๋ฌด๊ฒ๋ฅผ ์๊ณ ์์ ๋ ๋ฐฐ๋ญ์ ๋ด๊ธด ์ง์ ๊ฐ์น๋ฅผ ์ต๋๋ก ํ๋ ค๋ฉด?
๋ฐฐ๋ญ ๋ฌธ์ ๋ ์ง์ ์ชผ๊ฐค ์ ์๋ ๊ฒฝ์ฐ ๊ทธ๋ฆฌ๋๋ก, ์ชผ๊ฐค ์ ์๋ ๊ฒฝ์ฐ DP๋ก ํด๊ฒฐํ๋ค
- ์ชผ๊ฐค ์ ์๋ ๊ฒฝ์ฐ
- ๋จ์ ๋ฌด๊ฒ ๋น ๊ฐ์น๊ฐ ๊ฐ์ฅ ๋์ ์ง๋ถํฐ ๋ฐฐ๋ญ์ ๋ฃ์
๋์ ์ ์ต์๋ก ์ฌ์ฉํด์ ํน์ ์ก์๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ
๋ณด์ด๋ฒ
์ ๋ ฌ๋ ๋ฐฐ์ด์์ ๋ ๊ฐ์ ํฌ์ธํฐ๋ฅผ ์ด๋์ํค๋ฉฐ ์ํ๋ ๊ฐ์ ์ฐพ์
๊ณ ์ ์ฌ์ด์ฆ ์๋์ฐ๋ฅผ ์ด๋์ํค๋ฉฐ ํ์
์ ๋ ฌ๋์ง ์์ ๋ฐฐ์ด์์๋ ์ฌ์ฉ ๊ฐ๋ฅ
๊น์ด ์ฐ์ ํ์
DFS๋?
- ์คํ์ ์ด์ฉํ์ฌ ๊ทธ๋ํ์ ๋ชจ๋ ๋
ธ๋๋ฅผ ํ์
- ์์ ๊ณผ ์ฐ๊ฒฐ๋ ๋ ธ๋ ์ค ํ๋๋ฅผ ๋ฐฉ๋ฌธํจ
- ๋ฐฉ๋ฌธํ ๋ ธ๋๊ฐ ์์ผ๋ฉด(์ด๋ฏธ ๋ฐฉ๋ฌธํ ๋ ธ๋๋ค์ด๋ฉด), ์์ ์ ํธ์ถํ ๋ ธ๋๋ก ๋์๊ฐ
- ์ฒ์ ์ถ๋ฐํ ์์น์์ ํ์ ์ข ๋ฃ
- ๋ฐฉ๋ฌธ์ ์ฌ๊ท ํจ์๋ฅผ ์ด์ฉํ๊ฑฐ๋ ์คํ์ ๋ ธ๋๋ฅผ ์ฝ์ -์ญ์ ํ๋ ๊ฒ์ ๋ฐ๋ณตํจ์ผ๋ก์จ ๊ตฌํ
๋ฐฑํธ๋ํน์ ํตํด ๋ฐ์ด๋ ํจ์ฉ์ ๋ณด์
์ฌ๊ท๋ก ๊ตฌํํ DFS
def recursive_dfs(v, visited):
visited.append(v)
for w in graph[v]:
if w not in visited:
recursive_dfs(w, visited)
return visited๋ฐ๋ณต์ผ๋ก ๊ตฌํํ DFS
def iterative_dfs(v):
visited = []
stack = [v]
while stack:
t = stack.pop()
if t not in visited:
visited.append(t)
for w in graph[t]:
stack.append(w)
return visitedํด๊ฒฐ์ฑ ์ ๋ํ ํ๋ณด๋ฅผ ์์๊ฐ๋ค ๊ฐ๋ฅ์ฑ์ด ์๋ค๊ณ ํ๋จ๋๋ ์ฆ์ ํ๋ณด๋ฅผ ํฌ๊ธฐ(backtrack)
ํธ๋ฆฌ๋ฅผ ํ์ํ๋ค๊ฐ ๋ถํ์ํ ๋ถ๋ถ์ ๋ฒ๋ฆฌ๋ ๊ฒ์ ๊ฐ์ง์น๊ธฐ(pruning)๋ผ ํจ
๋๋น ์ฐ์ ํ์
BFS๋?
- ํ๋ฅผ ์ด์ฉํ์ฌ ์ถ๋ฐ์ ์ผ๋ก๋ถํฐ ๊ฐ๊น์ด ์์๋๋ก ํ์
- ์์ ๊ณผ ์ฐ๊ฒฐ๋ ๋ ธ๋๋ค์ ํ์ ์ฝ์ ํจ
- ํ์์ ์ถ์ถํ ๋ ธ๋๋ฅผ ์์ง ๋ฐฉ๋ฌธํ์ง ์์๋ค๋ฉด ๋ฐฉ๋ฌธํจ
- ๋ ์ด์ ๋ฐฉ๋ฌธํ ๋ ธ๋๊ฐ ์์ผ๋ฉด(ํ๊ฐ ๋น๋ฉด) ํ์ ์ข ๋ฃ
์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ์ ์ฃผ๋ก ์ฌ์ฉ๋จ
ํ๋ฅผ ์ด์ฉํ์ฌ ๊ตฌํ
def iterative_bfs(v):
visited = [v]
queue = [v]
while queue:
# ํ์ด์ฌ์ผ๋ก ํ๋ ์ ์ฌ์ฉํ์ง ์์ผ๋ ๋ฑ์ ์ฌ์ฉํ๋ค. ์ฌ๊ธฐ์๋ ํ ์ด์ฉ
t = queue.pop(0)
for w in graph[t]:
if w not in visited:
visited.append(w)
queue.append(w)
return visited์ ๋ ฌ๋ ๋ฐ์ดํฐ์์ ํ์ ๋ฒ์๋ฅผ ์ ๋ฐ์ฉ ์ขํ๊ฐ๋ฉฐ ํ์
O(logN)
์ฌ๊ท๋ฅผ ์ด์ฉํ์ฌ ๊ตฌํ
def binary_search(arr, target):
def search(left, right):
if left > right:
return -1
mid = (left+right)//2
if target < arr[mid]:
return search(left. mid-1)
elif target > arr[mid]:
return search(mid+1, right)
else:
return mid
return search(0, len(arr)-1)๋ฐ๋ณต์ ์ด์ฉํ์ฌ ๊ตฌํ
def binary_search(arr, target):
n = len(arr)
l, r = 0, n-1
while l <= r:
mid = (l + r) // 2
if target < arr[mid]:
r = mid-1
elif target > arr[mid]:
l = mid+1
else:
return mid
return -1ํ์ด์ฌ์์๋ ๊ทธ๋ฅ ๋ชจ๋์ ์ฐ์
๋ณด๊ฐ ํ์์ด๋?
-
ํ์ ๋์์ ์์๊ณผ ๋ ๊ฐ์ ์ด์ฉํ์ฌ ๋น๋ก์์ ๊ตฌ์ฑํด ํ์ ์์น๋ฅผ ๊ฒฐ์ ํ๋ ๋ฐฉ์
- ์ด์ง ํ์์ ๋ฌด์กฐ๊ฑด ์ค์์ ์์นํ ๋ฐ์ดํฐ๋ฅผ ํ์ : ๋ ์ชฝ์ ์น์ฐ์น ๋ฐ์ดํฐ ํ์์ ๋นํจ์จ ๋ฐ์
-
๋ณด๊ฐ ํ์ํ ์ธ๋ฑ์ค์ ๊ณ์ฐ
-
target๊ฐ-์์ ๊ฐ ์ฐจ์ด vs ์์ ๊ฐ-๋ ๊ฐ ์ฐจ์ด์ ๋น์จ์ด ์ ์ฒด ๊ธธ์ด์์ target ์ธ๋ฑ์ค ๊ธธ์ด๊ฐ ์ฐจ์งํ๋ ๋น์จ
-
$$ s = {target - arr[low] \over arr[high] - arr[low]}(high - low) + low $$
-
๋ณด๊ฐ ํ์์ ๊ตฌํ
- ์ด์ง ํ์๊ณผ ๋๊ฐ์ด ๊ตฌํํ๋ ํ์ํ ์ธ๋ฑ์ค
mid๋ฅผ ์ ์์์ ์ด์ฉํ์ฌ ์ค์ ํ๋ฉด ๋จ - ํ์ถ ์กฐ๊ฑด์ ์ค์
- ์ด์ง ํ์์ฒ๋ผ
if(left > right)๋ฅผ ์ด์ฉํด์๋ ์ ๋จ- mid๊ฐ์ด left~right๋ฒ์๋ฅผ ๋ฒ์ด๋จ์ ๋ฐ๋ผ ๋ฌดํ ๋ฃจํ์ ๋น ์ง ์ ์์
if(arr[left] > target || arr[right] < target)๋ก ์ค์ ํด์ผ ํจ- ์กฐ๊ธ ๋ ๋์ ์กฐ๊ฑด์ ์ค์
- "ํ์ ๋์์ด ์กด์ฌํ์ง ์์ ๊ฒฝ์ฐ ํ์ ๋์์ ๊ฐ์ ํ์ ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ค"
- ์ด์ง ํ์์ฒ๋ผ
์ค๋ฌด์์ ์ธ ์ผ์ ์์ง๋ง...
๋ฌธ์ ํด๊ฒฐ ๊ธฐ๋ณธ ์์ด๋์ด๋ ๊ฒ๋ ์๋ค. ํ๋์ฉ ๋น๊ตํด์ ํฌ๋ฉด ๋ค๋ก ๋๊ธด๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ
for i in range(n): # ๋ฐ๋ณต ํ์
for j in range(n-i-1): # i๋ฒ์งธ ๋ฐ๋ณต์ผ ๋ ๋ค์์ i๋ฒ ์ธ๋ฑ์ค๊น์ง๋ ์ ๋ ฌ๋์ด ์์
if arr[j] > arr[j+1]:
arr[j], arr[j+1] = arr[j+1], arr[j]์๊ฐ ๋ณต์ก๋
- ์ต์ ์ ๊ฒฝ์ฐ์๋(์ด๋ฏธ ์ ๋ ฌ๋ ๊ฒฝ์ฐ) n*(n-1)/2๋ฒ ์ฐ์ฐํด์ผ ํจ
- ์ต์ ์ ๊ฒฝ์ฐ(์ญ์์ผ๋ก ์ ๋ ฌ) ๋งจ ์๋ swap์ฐ์ฐ์ ๋ชจ๋ ํด์ผ ํ์ง๋ง ์ต์ ์ ๊ฒฝ์ฐ์ ์์๋ฐฐ์ด๊ธฐ ๋๋ฌธ์ O(n^2)
๋ฌธ์ ํด๊ฒฐ ๊ธฐ๋ณธ ์์ด๋์ด
- ๋ฐฐ์ด ๋ด ๊ฐ์ฅ ์์ ์์๋ฅผ ์ฐพ๊ณ
- ํด๋น ์์๋ฅผ ์ ์ผ ์์ ์๋ ์์์ swapํ ํ ๋ค์ ๋ฐ๋ณต
์ ์ผ ํฐ ์์๋ฅผ ๋งจ ๋ค๋ก ์ด๋์ํค๋ bubble sort์ ์ ํํ ๋ฐ๋๋ผ๊ณ ํ ์ ์์
ํด๊ฒฐ ๋ฐฉ๋ฒ
for i in range(len(arr)-1):
# ๋ฐฐ์ด ๋ด์์ ๊ฐ์ฅ ์์ ์์๋ฅผ ์ฐพ์์ ์ธ๋ฑ์ค i์ ์ ์ฅ
minId = i
for j in range(i+1, len(arr)):
if arr[j] < arr[minId]:
minId = j
# ์ฐพ์์ผ๋ฉด (for๋ฌธ์ด ๋๋ฌ์ผ๋ฉด) ์ ๋ ฌ๋์ง ์์ ์ ์ค์ ์ ์ผ ์์ ์์ swap
arr[minId], arr[i] = arr[i], arr[minId]์ด๋ฏธ ์ ๋ ฌ๋ ๋ฐฐ์ด์ ๋ํด์๋ O(N)์ ๋๋๋ ์ ๋ ฌ
๋ฌธ์ ํด๊ฒฐ ๊ธฐ๋ณธ ์์ด๋์ด
์ ๋ ฌ๋์ด ์๋ ๋ถ๋ถ๊ณผ ๊ทธ๋ ์ง ์์ ๋ถ๋ถ์ผ๋ก ๋๋์ด ์ ๋ ฌ ์ ๋ ๋ถ๋ถ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฌ๋ ๋ถ๋ถ์ ์ฝ์ ํ๋ ๊ฒ
- ๋ฐฐ์ด์ ๋ ๋ฒ์งธ ์์๋ถํฐ ๋ค์์ ๋ฐ๋ณต
- ์์ ์ ์์ ์๋ ์์๋ค๊ณผ ํ๋์ฉ ๋น๊ตํ์ฌ, ์์ ์ด ์์ผ๋ฉด ์์ผ๋ก ์ด๋ํ๊ณ ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ฉ์ถค
- ์ ์ผ ์์ ์๋ ๋งจ ์์ผ๋ก ์ด๋ํ๋ ์์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌ๋จ
ํด๊ฒฐ ๋ฐฉ๋ฒ
# ์ฒซ ๋ฒ์งธ ์์๋ ๋๋๊ณ ๋ ๋ฒ์งธ ์์๋ถํฐ ์์
for i in range(1, len(arr)):
# ํ์ฌ ๋ณด๊ณ ์๋ ์์ arr[i]๋ฅผ ์์ ์๋ ์๋ค๊ณผ ๋น๊ต
for j in range(i, 0, -1):
# ์์ ์๊ฐ ๋ ์๋ค๋ฉด swapํ์ฌ ์์ผ๋ก ์ด๋, ์๋๋ฉด stop
if arr[j] < arr[j-1]:
arr[j], arr[j-1] = arr[j-1], arr[j]
else:
break์๊ฐ ๋ณต์ก๋
- ์ต์ ์ ๊ฒฝ์ฐ(์ด๋ฏธ ์ ๋ ฌ๋จ) ์์ชฝ์ for๋ฌธ์์ ํญ์ break๊ฐ ํธ์ถ๋๊ธฐ ๋๋ฌธ์ O(n)์ผ๋ก ๋๋จ
- ์ต์ ์ ๊ฒฝ์ฐ ๋ค๋ฅธ ์ ๋ ฌ๋ค๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก O(n^2)๋ฅผ ์๋ชจํจ
๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ
ํ๊ท ์ ์ผ๋ก O(NlogN)์ด์ง๋ง ์ต์ ์ ๊ฒฝ์ฐ O(N^2)
๋ฌธ์ ํด๊ฒฐ ๊ธฐ๋ณธ ์์ด๋์ด
- ๊ธฐ์ค ๋ฐ์ดํฐ๋ฅผ ์ค์ ํ๊ณ ๊ธฐ์ค๋ณด๋ค ํฐ ๋ฐ์ดํฐ์ ์์ ๋ฐ์ดํฐ์ ์์น๋ฅผ ๋ฐ๊ฟ
- ๊ธฐ์ค์ ์ ํ๋ ๋ฐฉ์์ ๋ฐ๋ผ Hoare Partition, Lumoto Partition์ด ์กด์ฌ
- Hoare๋ ๋งจ ์์, Lumoto๋ ๋งจ ๋ค๋ฅผ pivot์ผ๋ก ์ค์
- ํผ๋ฒ์ด ์ ์ผ ์์ ๊ฐ or ์ ์ผ ํฐ ๊ฐ์ผ๋ก ์ค์ ๋๋ฉด ์ฑ๋ฅ์ด ๋จ์ด์ง๊ธฐ ๋๋ฌธ์ ์ค๊ฐ์ผ๋ก ์ค์ ํด์ค์ผ ํจ
- ๋์๋ฅผ ์ด์ฉํด์ ์ค์ ํ๊ฑฐ๋(๋ถ์์ ) ์ผ์ชฝ, ์ค๋ฅธ์ชฝ, ๊ฐ์ด๋ฐ ์ค ์ค์๊ฐ์ ์ด์ฉํด์ ์ค์ ๊ฐ๋ฅ(์์ )
- Hoare๋ ๋ค์๊ณผ ๊ฐ์ด ์ ๋ ฌํจ
i=1, j=len(n)-1๋ก ์ค์ ํ์ฌ ๊ฐ๊ฐ ์ค๋ฅธ์ชฝ๊ณผ ์ผ์ชฝ์ผ๋ก ์ด๋์ํค๋ฉด์ pivot๊ณผ ๋น๊ต- pivot๋ณด๋ค ์์ ๋ฐ์ดํฐ๋ฅผ ์ผ์ชฝ์, ํฐ ๋ฐ์ดํฐ๋ฅผ ์ค๋ฅธ์ชฝ์ ์์น์ํด
- i์ j๊ฐ ๊ต์ฐจ๋๋ฉด pivot๊ณผ j๋ฅผ swap
- ๋ค์ pivot์ ๋ํด์๋ ๋ฐ๋ณต
ํด๊ฒฐ ๋ฐฉ๋ฒ
def quick_sort(arr, start, end):
if start >= end:
return
pivot = start
left = start + 1
right = end
while left <= right:
# ํผ๋ฒ๋ณด๋ค ํฐ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์๋๊น์ง
while left <= end and arr[left] <= arr[pivot]: left += 1
# ํผ๋ฒ๋ณด๋ค ์์ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์๋๊น์ง
while right > start and arr[right] > arr[pivot]: right -= 1
# ์๊ฐ๋ ธ๋ค๋ฉด ์์ ๋ฐ์ดํฐ์ ํผ๋ฒ์ ๊ต์ฒด
# left ์ผ์ชฝ์ผ๋ก๋ ์ ๋ถ ํผ๋ฒ๋ณด๋ค ์์์ด ๋ณด์ฅ๋์ง๋ง left๋ ํผ๋ฒ๋ณด๋ค ํฐ ๊ฐ์ ๊ฐ๋ฆฌํค๊ณ ์์ผ๋ฏ๋ก
if left > right:
arr[pivot], arr[right] = arr[right], arr[pivot]
# ์๊ฐ๋ฆฌ์ง ์์๋ค๋ฉด ์์ ๋ฐ์ดํฐ์ ํฐ ๋ฐ์ดํฐ๋ฅผ ๊ต์ฒด
else:
arr[left], arr[right] = arr[right], arr[left]
quick_sort(arr, start, right-1)
quick_sort(arr, right+1, end)Stable sort๋ก ์ต์ ๊ณผ ์ต์ ๋ชจ๋ O(nlogn)์ ์ฑ๋ฅ์ ๋ณด์
๋ถํ ์ ๋ณต์ ์ง์๋ฅผ ๋ณด์ฌ์ฃผ๋ ์๊ณ ๋ฆฌ์ฆ
๋ฌธ์ ํด๊ฒฐ ๊ธฐ๋ณธ ์์ด๋์ด
- ๋ฐฐ์ด์ ๊ฐ์ฅ ์์ ๋จ์(1๊ฐ์ฉ)๊น์ง ์ชผ๊ฐ ๋ค
- ์์ ๋ฐฐ์ด์ ์ ๋ ฌํ ํ 2๊ฐ์ฉ ๋ณํฉํ๋ฉด์ ๋ค์ ์ ๋ ฌ๋ ๋ฐฐ์ด์ ๊ตฌ์ฑํ๋ค
- ์๋ ๋ฐฐ์ด์ ํฌ๊ธฐ๊ฐ ๋ ๋๊น์ง ๋ฐ๋ณตํ์ฌ ์๋ ๋ฐฐ์ด์ ์ ๋ ฌ๋ ์ํ๋ก ๋ง๋ ๋ค
ํด๊ฒฐ ๋ฐฉ๋ฒ
def merge_sort(list):
if len(list) <= 1:
return list
mid = len(list) // 2
leftList = list[:mid]
rightList = list[mid:]
# ์ผ์ชฝ๊ณผ ์ค๋ฅธ์ชฝ์ ๊ฐ๊ฐ ์ ๋ ฌํ ํ ๋ณํฉ
leftList = merge_sort(leftList)
rightList = merge_sort(rightList)
return merge(leftList, rightList)
def merge(left, right):
result = []
while len(left) > 0 or len(right) > 0:
if len(left) > 0 and len(right) > 0:
if left[0] <= right[0]:
result.append(left[0])
left = left[1:]
else:
result.append(right[0])
right = right[1:]
elif len(left) > 0:
result.append(left[0])
left = left[1:]
elif len(right) > 0:
result.append(right[0])
right = right[1:]
return result์ํฉ์ ๋ฐ๋ผ O(NlogN)๋ณด๋ค ๋นจ๋ผ์ง ์ ์์ผ๋ฏ๋ก ๊ทธ ์ํฉ์ ๊ธฐ์ตํด๋๋ค ํ์ฉํ์
O(N+K)์ด๋ฏ๋ก ๋ฐ์ดํฐ ์ค ์ต๋๊ฐ์ด ๋๋ฌด ํฌ์ง๋ง ์์ผ๋ฉด ๋๊ฐ์ ๊ฒฝ์ฐ ์์ฃผ ๋น ๋ฆ
๋ฌธ์ ํด๊ฒฐ ๊ธฐ๋ณธ ์์ด๋์ด
๋ฐ์ดํฐ์ ๋ชจ๋ ๋ฒ์๋ฅผ ๋ด์ ์ ์๋ ๋ฐฐ์ด์ ๋ง๋ค๊ณ ๊ฑฐ๊ธฐ์ ๋ฐ์ดํฐ๋ฅผ ํ ๋ฒ ์ฉ๋ง ์ฑ์
๋ฐฐ์ด์ ์ ์ธ โ ๋ฐ์ดํฐ๋ฅผ ์ํํ๋ฉด์ ํด๋น ์ซ์์ ๊ฐ์ ์ธ๋ฑ์ค์ ๋ฐฐ์ด์ ๊ฐ์ 1์ฉ ์ถ๊ฐํ๋ค โ ๋
ํด๊ฒฐ ๋ฐฉ๋ฒ
# ๋ฐ์ดํฐ์ ์ต๋ ๋ฒ์๋งํผ์ ๊ธธ์ด๋ฅผ ๊ฐ๋ ๋ฐฐ์ด ์ ์ธ
count = [0]*n
for i in range(len(arr)):
count[arr[i]] += 1
for i in range(len(count)):
for j in range(count[i]):
print(i, end=' ')๋น๊ต์ฐ์ฐ ์์ด ์ ๋ ฌํ๋ ์๊ณ ๋ฆฌ์ฆ
๊ธฐ์ ์ ๋ ฌ์ด๋?
- ์๋ฆฟ์๊ฐ ์๋ ๋ฐ์ดํฐ์ ๋ํด
- ์๋ฆฟ์๊ฐ ์ ์ ๋ ํจ์จ์ด ์ข์
- ์๊ฐ ๋ณต์ก๋ : O(kn), k๋ ๋ฐ์ดํฐ์ ์๋ฆฟ์
- ๋ฌธ์์ด ์ ๋ ฌ ๋ฑ์ ์ฌ์ฉํ ๊ฒฝ์ฐ ์ฐ์ฐ์ด ๋ง์์ง๊ธฐ ๋๋ฌธ์ ๋นํจ์จ์
- ์ข
๋ฅ
- Least Significant Digit : ๋ฎ์ ์๋ฆฟ์๋ถํฐ ์ ๋ ฌ
- Most Significant Digit : ๋์ ์๋ฆฟ์๋ถํฐ ์ ๋ ฌ
๋ฌธ์ ํด๊ฒฐ ๊ธฐ๋ณธ ์์ด๋์ด(LSD ๊ธฐ์ค)
- Radix(๊ธฐ์)์ ๊ฐฏ์์ ํด๋นํ๋ ๊ธธ์ด์ ๋ฐฐ์ด์ ๋ง๋ ๋ค
- 10์ง๋ฒ์ด๋ฉด ๊ธธ์ด 10
- ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์์๋๋ก ํ์ฌ ์๋ฆฟ์์ ์ซ์๋ฅผ ์ธ๋ฑ์ค๋ก ํ์ฌ ๋ฐฐ์ด์ ์ ์ฅ
- ๋ฐฐ์ด์ ์์๋ Queue์ฌ์ผ ํจ : 14, 34๋ฉด ์ธ๋ฑ์ค 4์ ๋ ์ซ์๊ฐ ์์๋๋ก ์ ์ฅ๋์ด์ผ ํ๊ธฐ ๋๋ฌธ
- ๋ค์ ์๋ฆฟ์๋ก ์ด๋ํ์ฌ ๋ฐฐ์ด์์ ๋ฐ์ดํฐ๋ฅผ ๊บผ๋ธ ํ 2๋ฅผ ๋ฐ๋ณต
ํด๊ฒฐ ๋ฐฉ๋ฒ
buckets = [[] for _ in range(m)] # m์ง๋ฒ
div = 1
for i in range(k): # ๊ฐ์ฅ ํฐ ์์ ๊ธธ์ด๊ฐ k์ผ ๋
for j in range(n): # ์ ๋ ฌํ ์์ ๊ฐฏ์
radix = (arr[j]//div) % m # j๋ฒ์งธ ์๋ฆฌ์ ์ซ์๋ฅผ ์ถ์ถ
buckets[radix].append(arr[j]) # ์ถ์ถํ ์ซ์๋ฅผ ๊ทผ๊ฑฐ๋ก ๋ฒํท์ ๋ฐ์ดํฐ ์ ์ฅ
j = 0
for k in range(m):
while buckets[k]: # ๋ฒํท์ ๋ด๊ธด ๋ฐ์ดํฐ๋ฅผ ๋ค์ arr๋ก ์ฎ๊น
arr[j] = buckets[k].pop()
j += 1
div *= m # ๋ค์ ์๋ฆฌ๋ก ์ด๋ํ๊ธฐ ์ํด ๋๋๋ ์ ์ฆ๊ฐ๋ฌธ์ ๋ฅผ ๊ฐ๊ฐ์ ์์ ๋ฌธ์ ๋ก ๋๋์ด ํด๊ฒฐํ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํด๋๋ค๊ฐ ๋์ค์ ํฐ ๋ฌธ์ ์ ๊ฒฐ๊ณผ์ ํฉํ์ฌ ํ์ด
์ต์ ๋ถ๋ถ ๊ตฌ์กฐ๋
- ์ ์ฒด ๋ฌธ์ ์ ์ต์ ํด๊ฐ ๋ถ๋ถ ๋ฌธ์ ์ ์ต์ ํด์ ํฉ์ผ๋ก ๊ตฌ์ฑ๋๋ ๊ฒฝ์ฐ
- ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์ผ๋ก๋ ์ต์ ๋ถ๋ถ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋ฉฐ ์ค๋ณต๋ ํ์ ๋ฌธ์ ๋ค๋ก ํ ์ ์๋ ๋ฌธ์ ๋ฅผ ํผ๋ค
- ๋ถํ ์ ๋ณต์ผ๋ก ํธ๋ ๋ฌธ์ ๋ ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ๋ณต๋์ง๋ ์์
- ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ๋ณต๋๋ ๋ํ์ ์ธ ์๋ก๋ ํผ๋ณด๋์น ์์ด์ด ์์
๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ๋ฒ๋ก
-
ํํฅ์: ๋ฉ๋ชจ์ด์ ์ด์
-
ํ์ ๋ฌธ์ ์ ๋ํ ์ ๋ต์ ๊ณ์ฐํ๋์ง ํ์ธํด๊ฐ๋ฉฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐ
-
def fib(n): if n <= 1: return n if dp[n]: # ํ์ ๋ฌธ์ ์ ๋ต์ ๊ณ์ฐํ๋์ง ํ์ธ return dp[n] dp[n] = fib(n-1) + fib(n-2) return dp[n]
-
-
์ํฅ์: ํ๋ทธ๋ ์ด์
-
ํ์ ๋ฌธ์ ๋ฅผ ๋จผ์ ํด๊ฒฐํ๊ณ ํฐ ๋ฌธ์ ์ ์ ๋ต์ ๊ตฌํจ
-
๋ฐ์ดํฐ๋ฅผ ํ ์ด๋ธ ํํ๋ก ๋ง๋ ๋ค๋ ๋ป Tabulate
-
def fib(n): dp[0] = 0 dp[1] = 1 for i in range(2, n+1): # ํ์ ๋ฌธ์ ๋ฅผ ์ฐจ๋ก๋๋ก ์ ๋ต์ ํ์ด ๋๊ฐ dp[i] = dp[i-1] + dp[i-2] return dp[n]
-
์์ด nums ๋ด ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ ์์ด์ ๊ธธ์ด๋ ์ผ๋ง์ธ๊ฐ?
๋ฌธ์ ํด๊ฒฐ ๊ธฐ๋ณธ ์์ด๋์ด
- ์์ด์ ์์ฐจ์ ์ผ๋ก ๋๋ฉด์
- ํ์ฌ ๋ณด๊ณ ์๋ nums[i]๋ณด๋ค ์์ ๋์์ LIS์ ๋ง์ง๋ง ์์์ธ ์๋ฅผ ์ฐพ์
- ์์ฐจ์ ์ผ๋ก ์ฐพ์ผ๋ฉด O(N^2), ์ด์ง ํ์ํ๋ฉด O(NlogN)
- ์ฐพ์๋ค: ํ์ฌ ๋ณด๊ณ ์๋ ์๊ฐ LIS์ ๋ง์ง๋ง ์์๊ฐ ๋จ, LIS์ ๊ธธ์ด += 1
- ๋ชป ์ฐพ์๋ค
- O(N^2): ์ ๋ฐ์ดํธ ํ์ํ์ง ์์ผ๋ฏ๋ก ๋ฌด์
- O(NlogN): ์ ๋ฐ์ดํธ ํ์(์ด์ง ํ์ ์ํด์ ์ค๋ฆ์ฐจ์ ์ ๋ ฌ ํด์ค์ผ)
ํด๊ฒฐ ๋ฐฉ๋ฒ
-
O(N^2)์ธ ๋ฐฉ๋ฒ
-
# nums[i]๋ฅผ ๋ง์ง๋ง ์์๋ก ํ๋ '์ฆ๊ฐํ๋ ์์ด'์ ๊ธธ์ด๋ฅผ ๋ด๋ ๋ฐฐ์ด LIS = [0]*n for i in range(n): # nums[i]๋ณด๋ค ์์ ์ ์ค์, ์ฆ๊ฐํ๋ ์์ด์ ๊ธธ์ด๋ฅผ ์ต๋๊ฐ ๋๊ฒ ํ๋ ์ธ๋ฑ์คj๋ฅผ ์ฐพ์ temp = 0 for j in range(i): if nums[j] < nums[i] and LIS[j] > temp: temp = LIS[j] LIS[i] = temp + 1 # LIS๋ฐฐ์ด ๋ด์์ ์ต๋๊ฐ์ ์ถ๋ ฅํ๋ฉด ์ข ๋ฃ print(max(LIS))
-
-
O(NlogN)์ธ ๋ฐฉ๋ฒ
-
nums ๋ด์ ์กด์ฌํ๋ ์ฆ๊ฐํ๋ ๋ถ๋ถ์์ด๋ค์ ๋ง์ง๋ง ์์์ ํฌ๊ธฐ์ ๋ฐ๋ผ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํจ
- ๋จผ์ ๋ถ๋ถ์์ด์ ๊ธธ์ด ๋ณ๋ก, ํด๋น ๊ธธ์ด์ ์์ด ์ค ๊ฐ์ฅ ์์ ๋ง์ง๋ง ์์๋ฅผ ์ ์ฅํ๋ ๋ฐฐ์ด์ ์์ฑ
- ๋ถ๋ถ์์ด๋ค์ ๋ง์ง๋ง ์์ ์ค nums[i] ๋ฐ๋ก ๋ค์์ผ๋ก ํฐ ์๋ฅผ ์ฐพ์
- ํด๋น ์์๋ฅผ nums[i]๋ก ๊ฐฑ์ ํด ์ค: ํด๋น ๋ถ๋ถ์์ด์ด ๋ ์์ ์๋ฅผ ๋ง์ง๋ง ์์๋ก ๊ฐ์ ธ์ผ ๋ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ์์ด์ ๊ฐ์ง ์ ์์
- ๋ถ๋ถ์์ด๋ค์ ๋ง์ง๋ง ์์์ ํฌ๊ธฐ๊ฐ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ๋จ
-
# ์ด์งํ์์ ํ๊ธฐ ์ํ ๋ฐฐ์ด LIS # ์ฒซ ๋ฒ์งธ ์ธ๋ฑ์ค๋ ๋ถ๋ถ์์ด์ ๊ธธ์ด, ๋ ๋ฒ์งธ ์ธ๋ฑ์ค๋ ํด๋น ๋ถ๋ถ์์ด์ ๋ง์ง๋ง ์์ LIS = [[1, nums[0]]] for i in range(1, n): # nums[i]๊ฐ LIS์์ ๋ช ๋ฒ ์งธ ์์น๋ก ๊ฐ ์ ์๋์ง ํ์ index = binary(LIS, 0, len(LIS)-1, nums[i]) if index > len(LIS)-1: LIS.append([LIS[-1][0]+1, nums[i]]) else: LIS[index] = [LIS[index][0], nums[i]] # LIS๋ฐฐ์ด ๋ด์์ ์ต๋๊ฐ์ ์ถ๋ ฅํ๋ฉด ์ข ๋ฃ print(LIS[-1][0])
-
๋ ์์ด์ ๋ถ๋ถ์์ด๋ค์ ๋น๊ตํ์ ๋ ๊ณตํต์ ๋ถ๋ถ์์ด์ด ๋๋ ๊ฒ ์ค์ ๊ฐ์ฅ ๊ธด ๊ฒ์?
๋ฌธ์ ํด๊ฒฐ ๊ธฐ๋ณธ ์์ด๋์ด
ํด๊ฒฐ ๋ฐฉ๋ฒ
์๋ค๊ฐ ๋๊ฐ์ ์ ํ๋ฒํธ
๋ฌธ์ ํด๊ฒฐ ๊ธฐ๋ณธ ์์ด๋์ด
- ํฐ๋ฆฐ๋๋กฌ์ ์ด๋ฃจ๋ ค๋ฉด, ํด๋น ์์ด์ ์ ๋์ ํ๋ฏธ๋ ๊ฐ์ ์์ฌ์ผ ํ๋ค
- ์ ๋์ ํ๋ฏธ๋ฅผ ์ ์ธํ ๋ด๋ถ์ ์์ด์ด ํฐ๋ฆฐ๋๋กฌ์ ์ด๋ฃฌ๋ค๋ฉด ํด๋น ์์ด์ ํฐ๋ฆฐ๋๋กฌ์ด๋ค
ํด๊ฒฐ ๋ฐฉ๋ฒ
-
s๋ฒ์งธ ์์์ e๋ฒ์งธ ์๊น์ง์ ์์ด์ด ํฐ๋ฆฐ๋๋กฌ์ธ์ง ์ ์ ์๊ฒ ํ๋ N x N ๋ฐฐ์ด์ ์์ฑ
-
๋จผ์ ๊ธธ์ด 1์ธ ์์ด์ ๋ฌด์กฐ๊ฑด ํฐ๋ฆฐ๋๋กฌ์ด๋ฏ๋ก, ๋ฐ๋ณต๋ฌธ์ ์ด์ฉํด
arr[i][i] = 1์ ๋ ฅ -
๊ธธ์ด 2๋ถํฐ n๊น์ง์ ์์ด์ด ํฐ๋ฆฐ๋๋กฌ์ธ์ง ํ๋ณํ๊ธฐ ์ํด, ๊ธฐ๋ณธ ์์ด๋์ด๋ฅผ ์ด์ฉ
# ๋จผ์ ๊ธธ์ด1 ํฐ๋ฆฐ๋๋กฌ๊ณผ ๊ธธ์ด2 ํฐ๋ฆฐ๋๋กฌ(์ฐ์ํ ๋ ์๊ฐ ๊ฐ๋ค๋ฉด)์ ๋ํด dp์ True๋ฅผ ๊ธฐ๋ก for i in range(1, n+1): dp[i][i] = 1 if nums[i-1] == nums[i]: dp[i-1][i] = 1 # ๊ธธ์ด 3๋ถํฐ n๊น์ง์ ํฐ๋ฆฐ๋๋กฌ์ ๊ธฐ๋ก for i in range(3, n+1): for j in range(1, n-i+2): # ์์๊ณผ ๋์ด ๊ฐ๊ณ ๊ทธ ๋ด๋ถ๊ฐ ํฐ๋ฆฐ๋๋กฌ์ ์ด๋ฃฌ๋ค๋ฉด ํฐ๋ฆฐ๋๋กฌ if nums[j] == nums[j+i-1] and dp[j+1][j+i-2]: dp[j][j+i-1] = 1
์ธํ์ ์ํ ๋ฌธ์
๋ฌธ์ ํด๊ฒฐ ๊ธฐ๋ณธ ์์ด๋์ด
- ๋จผ์ "์ํ"์ด๋ฏ๋ก ์ด๋ ์ง์ ์์ ์ถ๋ฐํด๋ ๊ฒฐ๊ณผ๋ ๊ฐ์: 0๋ฒ ๋์์์ ์ถ๋ฐํ๋ค ๊ฐ์
- ์ง๊ธ๊น์ง ๋ฐฉ๋ฌธํ ๋์์ ๋ชฉ๋ก์ผ๋ก ๋ฐฐ์ด์ด ์๋๋ผ ๋นํธ๋ง์คํน์ ์ด์ฉ
- ์ง๊ธ๊น์ง ๋ฐฉ๋ฌธํ ๋ชฉ๋ก์ผ๋ก๋ถํฐ, ์์ผ๋ก ๋ชจ๋ ๋์๋ฅผ ์ํํ๋ ๋ฐ ํ์ํ ๋น์ฉ ์ค ์ต์๊ฐ์ ์ทจํด ๋๊ฐ๋ฉด์ ๊ณ์ฐ์ ์งํ(๋์ ๊ณํ๋ฒ)
ํด๊ฒฐ ๋ฐฉ๋ฒ
-
n๋ฒ ๋์๋ฅผ ๋ฐฉ๋ฌธํ๊ณ ์์ ๋ ์ง๊ธ๊น์ง ๋ฐฉ๋ฌธํ ๋ชจ๋ ๊ฒฝ์ฐ์ ๋ํด ์์ผ๋ก ํ์ํ ์ต์ํ์ ๋น์ฉ์ ๋ด์ ๋ฐฐ์ด DP๋ฅผ
dp = [[ING]*(1<<n) for _ in range(n)]๊ณผ ๊ฐ์ด ๋ง๋ ๋ค -
๋๋จธ์ง๋ ์ฌ๊ท์ ์ผ๋ก ๊ตฌํํ๋ dp์ ๊ฐ์ด None์ด ์๋๋ผ๋ฉด(์ด๋ฏธ ๊ณ์ฐ์ ์ํํ๋ค๋ฉด) ๋ฆฌํดํ์ฌ ์ค๋ณต ์ ๊ฑฐ
# ํ์ฌ ์์น, ๋ฐฉ๋ฌธํ ๊ธฐ๋ก def travel(start, visit): # ๋ชจ๋ ๋์๋ฅผ ๋ค ์ํํ๋ค๋ฉด if visit == check: # ๋ง์ง๋ง ๋์์์ ์ถ๋ฐ ๋์๋ก ๋์๊ฐ๋ ๊ธธ์ด ์๋ค๋ฉด ๊ฐ์, ์๋๋ฉด INF ๋ฆฌํด return cost[start][0] or INF # ์ด๋ฏธ ํด๋น ์ถ๋ฐ์ ์ ๋ํด ๊ณ์ฐ์ด ์ด๋ฃจ์ด์ก๋ค๋ฉด ๋ฐ๋ก ๋ฆฌํด: ์ค๋ณต ์ ๊ฑฐ if dp[start][visit] is not None: return dp[start][visit] temp = INF for i in range(n): # i๋ก ๊ฐ๋ ๊ธธ์ด ์กด์ฌํ๊ณ , ์์ง ๋ฐฉ๋ฌธํ์ง ์์๋ค๋ฉด if cost[start][i] and visit & (1<<i) == 0: temp = min(temp, travel(i, visit|(1<<i))+cost[start][i]) # ํ์ฌ ์์น์ ํ์ฌ๊น์ง ๋ฐฉ๋ฌธํ ๋ชฉ๋ก์ ๋์๋๋ ์ต์๊ฐ์ ๊ฐฑ์ dp[start][visit] = temp return temp
์ด๋ค ๋ฐฐ์ด์ ์ต๋ ๋ถ๋ถํฉ์ ์ด๋ป๊ฒ ๊ตฌํ ๊ฒ์ธ๊ฐ?
๋ฌธ์ ํด๊ฒฐ ๊ธฐ๋ณธ ์์ด๋์ด
- ๋ฐฐ์ด arr์ ๋ํด i๋ฒ ์ธ๋ฑ์ค๊น์ง์ ์ต๋ ๋ถ๋ถํฉ์ dp[i]๋ผ๊ณ ํ์
dp[i] = max(dp[i-1], dp[i-1]+arr[i])
ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์๋ต^^
์์ ๊ฐ์ค์น๊ฐ ์๋ ๊ทธ๋ํ์ ํ ์ ์ ์์ ๋ชจ๋ ์ ์ ๊น์ง์ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ์๊ณ ๋ฆฌ์ฆ
๋ฌธ์ ํด๊ฒฐ ๊ธฐ๋ณธ ์์ด๋์ด
- ์ถ๋ฐ์ ์ผ๋ก๋ถํฐ ๊ฐ ๋
ธ๋ ๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๋ด์ ๋ฐฐ์ด D[V]๋ฅผ ์ ์ธ
- ๊ฐ์ INF๋ก ์ค์
- ๋ชจ๋ ๋
ธ๋๋ฅผ ๋ฐฉ๋ฌธํ ๋๊น์ง ๋ค์์ ๋ฐ๋ณตํจ
- ํ์ฌ ๋
ธ๋๋ก๋ถํฐ ๊ฐ ์ ์๋ ์์์ ๋
ธ๋์ ๋ํด
D[A] + dist[A][B]์D[B]๋ฅผ ๋น๊ต - ๋ ์ค ๋ ์์ ๊ฐ์ผ๋ก D[B]๋ฅผ ์ ๋ฐ์ดํธ
- ํ์ฌ ๋ ธ๋์ ๋ชจ๋ ์ฃผ๋ณ ๋ ธ๋์ ๋ํด ๊ฐ์ ์์ ์ ์ค์
- ํ์ฌ ๋ ธ๋์ ์ํ๋ฅผ ๋ฐฉ๋ฌธ ์๋ฃ๋ก ๋ฐ๊พธ๊ณ , ๋ฏธ๋ฐฉ๋ฌธ ๋ ธ๋์ค D[V]๊ฐ์ด ๊ฐ์ฅ ์์ ๊ณณ์ ๋ฐฉ๋ฌธํด์ ๋ฐ๋ณตํจ
- ํ์ฌ ๋
ธ๋๋ก๋ถํฐ ๊ฐ ์ ์๋ ์์์ ๋
ธ๋์ ๋ํด
ํด๊ฒฐ ๋ฐฉ๋ฒ
-
O(V^2)
-
๋ค์ต์คํธ๋ผ๊ฐ ์๋ ๊ณ ์ํ ๋ฐฉ๋ฒ
-
visit[start] = 1 distance[start] = 0 for i in graph[start]: distance[i[0]] = i[1] # ๋ชจ๋ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ๋ฉฐ ๊ฑฐ๋ฆฌ๋ฅผ ์ ๋ฐ์ดํธ for i in range(v-1): # ๋ฏธ๋ฐฉ๋ฌธ ๋ ธ๋ ์ค ์ถ๋ฐ์ ๊ณผ์ ๊ฑฐ๋ฆฌ๊ฐ ์ต๋จ์ธ ๊ณณ์ ํ์: O(V^2) now = get_smallest_node() visit[now] = 1 for edge in graph[now]: cost = distance[now] + edge[1] # ๋ค์ต์คํธ๋ผ์ ํต์ฌ: ์ถ๋ฐ์ -now + now-์ฃผ๋ณ๋ ธ๋ vs ์ถ๋ฐ์ -์ฃผ๋ณ๋ ธ๋ ๊ฑฐ๋ฆฌ ๋น๊ต if cost < distance[edge[0]]:
-
-
O((V+E)logV)
-
์ฐ์ ์์ ํ๋ฅผ ์ด์ฉํ ๋ฐฉ๋ฒ
-
E๋ ํ ๋ ธ๋์ ์ฐ๊ฒฐ๋ ์ฃผ๋ณ ๋ ธ๋์ ์
-
๊ฐ ๋ ธ๋๋ง๋ค ์ถ๋ฐ์ ์ผ๋ก๋ถํฐ ํ์ฌ๊น์ง ์ต๋จ๊ฑฐ๋ฆฌ ๊ณ์ฐ์ VlogV, ์ด์๋ ธ๋์ ์ต๋จ๊ฑฐ๋ฆฌ ๊ฐฑ์ ์ ElogV ํ์
-
# ๊ฐ ๋ ธ๋์ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ "์ ๋ฐ์ดํธ"ํ๋ ๋ฐ ์ฌ์ฉํ๋ ์ฐ์ ์์ํ q = [] heapq.heappush(q, (0, start)) # ์ถ๋ฐ์ ์ผ๋ก๋ถํฐ์ ๊ฐ ๋ ธ๋์ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ์ ์ฅํ๋ ๋ฐฐ์ด: ์ต์ข ๊ฒฐ๊ณผ distance[start] = 0 while q: dist, now = heapq.heappop(q) # ์ฐ์ ์์ ํ๋ ๊ฑฐ๋ฆฌ๊ฐ ์งง์ ๊ฒ๋ถํฐ ๋จผ์ ์ฒ๋ฆฌํจ # ๊ฐ์ ๋ ธ๋์ ๋ํด ๊ฑฐ๋ฆฌ๊ฐ ๋ ์งง์ ๊ฒฝ๋ก๋ฅผ ์ฒ๋ฆฌํ๋ค๋ฉด ๋ค์๋ถํฐ๋ ์ฒ๋ฆฌํ ํ์ ์์ # dist๊ฐ ๊ฐ๊ณ ์๋ ์ ๋ณด(ํ์ ์ ์ฅ๋ ๊ฑฐ๋ฆฌ)์ distance(์ฒ๋ฆฌ๋ ๊ฑฐ๋ฆฌ)๋ฅผ ๋น๊ต if distance[now] < dist: continue # now์ ์ฃผ๋ณ ๋ ธ๋๋ค์ ํ์ for edge in graph[now]: cost = dist + edge[1] if cost < distance[edge[0]]: distance[edge[0]] = cost heapq.heappush(q, (cost, i[0]))
-
์ํ์ ์ฆ๋ช
๊ท๋ฅ๋ฒ์ผ๋ก ์ฆ๋ช ๊ฐ๋ฅ ๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๊ทธ๋ํ ๋ด ์ต๋จ ๊ฒฝ๋ก๊ฐ ๋ชจ๋ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์๊ฑฐํ์ง๋ ์๋๋ค ๋ ๊ฐ์ ์ ์ธ์ฐ๊ณ ์ด๋ฅผ ๋ฐ๋ฐํด๋ณด์.
-
์์์ ๊ผญ์ง์ u์์๋ถํฐ v๊น์ง ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์ํ ์ต๋จ๊ฒฝ๋ก๋ฅผ ์์ ํ๊ณ , ๊ทธ ์์ ๋ ธ๋ w๊ฐ ์์
-
์ด ๋ w์ u์ ์ต๋จ๊ฒฝ๋ก๊ฐ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ๋ฐ๋ฅธ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ์ง ์๋๋ค๊ณ ๊ฐ์ ํ๋ฉด
-
u-w์ w-v์ ๊ฑฐ๋ฆฌ์ ํฉ์ด u-v์ ๊ฑฐ๋ฆฌ์ ํฉ๋ณด๋ค ์งง์์ ธ์ผ ํจ
- u-v๋ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์ํ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ๊ธฐ ๋๋ฌธ์, ์ด๊ฒ์ u-w๊ฑฐ๋ฆฌ + w-v๊ฑฐ๋ฆฌ์ ๊ฐ์์ผ ํจ
-
๊ทธ๋ผ u-v์ฌ์ด์ ์ต๋จ๊ฒฝ๋ก๋ณด๋ค ๋ ์งง์ ๊ฒฝ๋ก๊ฐ ์กด์ฌํด์ผ ํ๋ฏ๋ก ๋ชจ์
- ๋ฐ๋ผ์ u-w ์ฌ์ด์๋ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ๋ฐ๋ฅธ ์ต๋จ๊ฒฝ๋ก๋ณด๋ค ๋ ์งง์ ๊ฒฝ๋ก๋ ์กด์ฌํ์ง ์์
- ์ด๋ฅผ ๊ทธ๋ํ ๋ด ๋ชจ๋ ๋ ธ๋๋ก ํ์ฅํ ์ ์์
- ๋ชจ๋ ๋ ธ๋๋ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์ํด ์ต๋จ๊ฒฝ๋ก๋ฅผ ๊ตฌํ ์ ์์
๊ทธ๋ํ์ ๋ชจ๋ ๋ ธ๋ ๊ฐ์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ์๊ณ ๋ฆฌ์ฆ
์์ ๊ฐ์ค์น๋ฅผ ๊ฐ์ง๋ ๊ทธ๋ํ์์๋ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค
2021 ์นด์นด์ค ์ ์ ๊ณต์ฑ 1์ฐจ ์ฝ๋ฉํ ์คํธ 4๋ฒ
๋ฌธ์ ํด๊ฒฐ ๊ธฐ๋ณธ ์์ด๋์ด
- ๊ธฐ๋ณธ์ ์ผ๋ก ๋ค์ต์คํธ๋ผ์ ๊ฐ์ ์๋ฆฌ: ์ถ๋ฐ์ - ๋ ธ๋ ๋ฟ ์๋๋ผ ๋ชจ๋ ๋ ธ๋์ ๋ํด์ ํ์ฅ
- i-j ๊ฑฐ๋ฆฌ์ i์์ ์์์ ๋
ธ๋ k + k-j ๊ฑฐ๋ฆฌ๋ฅผ ๋น๊ตํด ๋ ์งง์ ์ชฝ์ผ๋ก i-j ๊ฑฐ๋ฆฌ๋ฅผ ์
๋ฐ์ดํธ
- ์ด๊ฑธ ๋ชจ๋ ๋ ธ๋ k์ ๋ํด์ ๋ฐ๋ณตํ์ฌ i-j์ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ์ป๋๋ค
- ๊ฐ์ ๊ฒ์ ๋ชจ๋ ๋ ธ๋์ ๋ํด ์คํํ๋ค
ํด๊ฒฐ ๋ฐฉ๋ฒ
-
๋ฐ๋ณต๋ฌธ 3๊ฐ๋ฅผ ์ค์ฒฉํ๋, ๊ฐ์ด๋ฐ ๋ ธ๋ k๊ฐ ์ ์ผ ์์ ์์ผ ํจ
- ์ด๊ฑด ์ํค๋ฐฑ๊ณผ์ ์ ์ค๋ช ๋์ด ์๋๋ฐ, ์์ฝํ์๋ฉด ๋ค์๊ณผ ๊ฐ์
- i์์ j๋ก ๊ฐ๋๋ฐ, 1~k๋ฒ ์ฌ์ด์ ๋
ธ๋๋ง ๊ฒฝ์ ํ ์ ์๋ค๊ณ ํ ๋ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ
path(i, j, k)๋ผ๊ณ ํ์ - ์ ์ํฉ์์ i์์ j๋ก ๊ฐ๋ ๋ชจ๋ ๊ฒฝ๋ก๋ k๋ฅผ ๊ฒฝ์ ํ๋๊ฐ or ๊ฒฝ์ ํ์ง ์๋๊ฐ ๋ก ๋ถ๋ฆฌ๋จ(DP)
- ๋ฐ๋ผ์
path(i, j, k)๋min(k๋ฅผ ๊ฒฝ์ ํ๋ ๊ฒฝ๋ก, k๋ฅผ ์ ๊ฒฝ์ ํ๋ ๊ฒฝ๋ก)๊ฐ ๋จ- k๋ฅผ ์ ๊ฒฝ์ ํ๋ ๊ฒฝ๋ก ์ค ์ต๋จ๊ฑฐ๋ฆฌ๋
path(i, j, k-1)์ - k๋ฅผ ๊ฒฝ์ ํ๋ ๊ฒฝ๋ก ์ค ์ต๋จ๊ฑฐ๋ฆฌ๋
path(i, k, k-1) + path(k, j, k-1)์
- k๋ฅผ ์ ๊ฒฝ์ ํ๋ ๊ฒฝ๋ก ์ค ์ต๋จ๊ฑฐ๋ฆฌ๋
- ๊ทธ๋ฌ๋ฏ๋ก k=1์์ ๋ชจ๋ i, j์ ๋ํด ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๊ณ , k=N์ด ๋ ๋๊น์ง ๋ฐ๋ณตํ๋ฉด ๋ชจ๋ ์์ ์ต๋จ๊ฒฝ๋ก๋ฅผ ์ฐพ์ ์ ์์
-
graph = [[INF]*(V+1) for _ in range(V+1)] # ์๊ธฐ ์์ ์ผ๋ก ๊ฐ๋ ๊ฑฐ๋ฆฌ๋ 0์ผ๋ก ์ด๊ธฐํ for a in range(1, V+1): graph[a][a] = 0 # ๋ ธ๋ a์์ b๋ก ๊ฐ๋ ๊ฑฐ๋ฆฌ c๋ฅผ ์ ๋ ฅ๋ฐ์ ๊ทธ๋ํ ์์ฑ for _ in range(E): a, b, c = map(int, input().split()) graph[a][b] = c # ์ ํ์์ ๋ฐ๋ผ ๊ฐ ๋ ธ๋ k์ ๋ํด a์์ b๋ก ๊ฐ๋ ์ต๋จ๊ฑฐ๋ฆฌ ๊ฐฑ์ # a-b๋ก ์ง์ ๊ฐ๋ ๊ฒ๋ณด๋ค a-k-b๋ก ๊ฐ๋ ๊ฑฐ๋ฆฌ๊ฐ ์งง์ผ๋ฉด ๊ฐฑ์ for k in range(1, V+1): for a in range(1, V+1): for b in range(1, V+1): graph[a][b] = min(graph[a][b], graph[a][k]+graph[k][b])
๊ณตํต ์์๊ฐ ์๋ ๋ ์งํฉ
๋ ํธ๋ฆฌ๊ฐ ์๋ก์ ์งํฉ์ธ์ง ํ์ธํ๋ ค๋ฉด UNION์ฐ์ฐ์ ํตํด root๊ฐ ๋ค๋ฅธ์ง ํ์ธํด๋ณธ๋ค
parent = [0] * V
# ๋จผ์ ๋ชจ๋ ๋
ธ๋์ ๋ํด ์๊ธฐ ์์ ์ ๋ถ๋ชจ๋ก ๊ฐ๋๋ก ์ค์ ํจ
for i in range(V):
parent[x] = x
# ์ฌ๊ท์ ์ผ๋ก ์์ ์ root๋ฅผ ์ฐพ๋ ํจ์
def find_parent(x):
if parent[x] != x:
# ๋ถ๋ชจ ๋
ธ๋๋ฅผ root๋ก ๊ฐฑ์ ํ์ฌ root์ ๋น ๋ฅด๊ฒ ์ ๊ทผํ ์ ์๋๋ก ํจ(๊ฒฝ๋ก ์์ถ)
parent[x] = find_parent(parent[x])
return parent[x]
# ๋
ธ๋ x์ ๋
ธ๋ y์ root๋ฅผ ๊ฐ๋๋ก ํจ: UNION
# ์ฌ๊ธฐ์ ๋ฒํธ๊ฐ ๋ ์์ ๋
ธ๋๋ฅผ ๋ถ๋ชจ๋ก ๊ฐ๊ฒ ํฉ์นจ
def union(x, y):
x = find_parent(x)
y = find_parent(y)
if x < y:
parent[y] = x
else:
parent[x] = yroot๋ณ๋ก ๊ตฌ๋ถํ์ฌ ์๋ก์ ์งํฉ์ ๋๋ ์ ์์
์ฌ์ดํด ํ๋ณํ๊ธฐ
- ๊ฐ ๊ฐ์ ์ ํ์ธํ๋ฉฐ ๊ฐ์ ์ ์ฐ๊ฒฐ๋ ๋ ๋
ธ๋์ root๋ฅผ ํ์ธ
- root๊ฐ ๋ค๋ฅด๋ค๋ฉด union์ ์ํ
- root๊ฐ ๊ฐ๋ค๋ฉด ์ฌ์ดํด์ด ์กด์ฌํ๋ ๊ฒ
- ๋ชจ๋ ๊ฐ์ ์ ๋ํด 1์ ๋ฐ๋ณต
์ ์ฅ ํธ๋ฆฌ๋?
- ํ๋์ ๊ทธ๋ํ๊ฐ ์์ ๋, ๋ชจ๋ ๋
ธ๋๋ฅผ ํฌํจํ๋ฉด์ ์ฌ์ดํด์ด ์กด์ฌํ์ง ์๋ ๋ถ๋ถ ๊ทธ๋ํ
- ์คํจ๋(์ ์ฅ) ํธ๋ฆฌ๋ DFS/BFS๋ฅผ ์ด์ฉํด ์ ํ ์๊ฐ์์ ์ฐพ์ ์ ์์
- ์ฌ์ดํด์ด๋?
- ๋จ์ ๊ฒฝ๋ก(simple path)์ด๋ฉด์ ์ฒ์๊ณผ ๋์ด ๊ฐ์ ๊ฒฝ๋ก
- ๋์ผํ ๊ฐ์ ์ ์ค๋ณตํ์ฌ ํฌํจํ์ง ์๋ ๊ฒฝ๋ก
- Minimum Spanning Tree(์ต์ ์ ์ฅ ํธ๋ฆฌ)๋?
- ์ ์ฅ ํธ๋ฆฌ์ ๋ชจ๋ ๊ฐ์ ์ ๊ฐ์ค์น ํฉ์ด ์ต์์ธ ๊ทธ๋ํ
- ๊ฐ์ ์ ์ + 1 = ์ ์ ์ ์ ๋ฅผ ๋ง์กฑํจ
- MST๋ฅผ ๋ง๋ค ์ ์๋ ์๊ณ ๋ฆฌ์ฆ
- Boruvka's algorithm O(m log n)
- Prim's algorithm O(m log n) or O(m + n log n)
- Kruskal's algorithm O(m log n)
๋ฌธ์ ํด๊ฒฐ ๊ธฐ๋ณธ ์์ด๋์ด
- ํ๋์ ์ ์ ์ ์์์ผ๋ก MST๊ฐ ๋ ๋๊น์ง ํธ๋ฆฌ๋ฅผ ํ์ฅํด ๋๊ฐ
๋ฌธ์ ํด๊ฒฐ ๊ธฐ๋ณธ ์์ด๋์ด
- ๋ชจ๋ ๊ฐ์ ์ ๋ํด ๋น์ฉ์ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ
- ๊ฐ์ ์ ๋น์ฉ์์๋๋ก ์ถ๊ฐํ๋๋ฐ, ์ฌ์ดํด์ ๋ฐ์์ํจ๋ค๋ฉด ์ถ๊ฐํ์ง ์์
- ๋น์ฉ์ด ์ ์ ์์๋๋ก ์ฌ์ดํด ์์ด ์ถ๊ฐํ๊ธฐ ๋๋ฌธ์ ๋ง ๊ทธ๋๋ก ์ต์ ๋น์ฉ ์ ์ฅ ํธ๋ฆฌ๊ฐ ๋จ
- ๊ฐ์ ์ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ๋ฉด ๊ฐ์ ์ ์ถ๊ฐํ๋ ๋ฐฉ์์ด ์๋๋ผ ๋นผ๋ ๋ฐฉ์์ด ๋จ
ํด๊ฒฐ ๋ฐฉ๋ฒ
-
์ฌ์ดํด์ ๋ฐ์์ํค๋์ง UNION์ ์ด์ฉํ์ฌ ํ๋ณํ๋ฉด์ ๊ตฌํ
- ์งํฉ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ด์ฉํด์ ํ๋ณํ๋ฉด ํจ์ฌ ๋น ๋ฅด๊ฒ ๋์ํจ
-
cnt = 0 for i in range(E): px = find_root(edge[i][0]) py = find_root(edge[i][1]) # cycle check if px != py: cnt += 1 union(px, py) # MST์ ๊ฐ์ ์ ์๋ ๋ ธ๋์ ๊ฐ์ -1 ์ด๋ค if cnt == V-1: break
๋ฐฉํฅ ๊ทธ๋ํ์ ๋ชจ๋ ๋ ธ๋๋ฅผ ๋ฐฉํฅ์ฑ์ ๊ฑฐ์ค๋ฅด์ง ์๋๋ก ์์๋๋ก ๋์ดํ๋ ๊ฒ
์ ์๊ณผ๋ชฉ์ ๊ณ ๋ คํ ํ์ต ์์ ์ค์ ์ ์๋ก ๋ค ์ ์์
๋ฌธ์ ํด๊ฒฐ ๊ธฐ๋ณธ ์์ด๋์ด
- ์ง์
์ฐจ์๊ฐ 0์ธ ๋
ธ๋๋ฅผ ํ์ ๋ฃ๋๋ค
- ์ง์ ์ฐจ์: ํน์ ํ ๋ ธ๋๋ก ๋ค์ด์ค๋ ๊ฐ์ ์ ๊ฐ์
- ์ง์ ์ฐจ์๊ฐ 0์ธ ๊ณผ๋ชฉ์ ์ ์๊ณผ๋ชฉ์ด ์๋ 1ํ๋ ๊ณผ๋ชฉ์ด๋ผ ํ ์ ์์
- ํ๊ฐ ๋น ๋๊น์ง ๋ค์์ ๋ฐ๋ณตํ๋ค
- ํ์์ ์์๋ฅผ ๊บผ๋ด ํด๋น ๋ ธ๋์์ ์ถ๋ฐํ๋ ๊ฐ์ ์ ์ ๊ฑฐํ๋ค
- ์๋กญ๊ฒ ์ง์ ์ฐจ์๊ฐ 0์ด ๋ ๋ ธ๋๋ฅผ ํ์ ๋ฃ๋๋ค
- ์ฃผ์) ์ฌ์ดํด์ด ์กด์ฌํ๋ค๋ฉด ๋ชจ๋ ๋
ธ๋๋ฅผ ๋ฐฉ๋ฌธํ๊ธฐ ์ ์ ํ๊ฐ ๋น
- ์ฌ์ดํด ๋ด ๋ ธ๋๋ค์ ์ง์ ์ฐจ์๊ฐ 0์ด ๋์ง ์๊ธฐ ๋๋ฌธ
ํด๊ฒฐ ๋ฐฉ๋ฒ
๋ชจ๋ ๋ ธ๋์ ๊ฐ์ ๋ค์ ํ ๋ฒ์ฉ ํ์ธํ๋ฏ๋ก ์๊ฐ ๋ณต์ก๋๋ O(V+E)
# ์ง์
์ฐจ์: ํด๋น ๋
ธ๋๋ก ๋ค์ด์ค๋ ๊ฐ์ ์ ๊ฐฏ์
indegree = [0]*(v+1)
graph = [[] for _ in range(v+1)]
for _ in range(e):
a, b = map(int, input().split())
graph[a].append(b)
indegree[b] += 1
q = deque()
for i in range(1, v+1):
# ์ง์
์ฐจ์๊ฐ 0์ธ ๋
ธ๋๋ฅผ ํ์ ๋ฃ๋๋ค
if indegree[i] == 0:
q.append(i)
while q:
# ํ์ฌ ๋ฐฉ๋ฌธ์ค์ธ ๋
ธ๋ now
now = q.popleft()
for node in graph[now]:
# now์์ ์ถ๋ฐํ๋ ๊ฐ์ ์ ์ ๊ฑฐ: ๋์ฐฉ ๋
ธ๋๋ค์ ์ง์
์ฐจ์ -=1
indegree[node] -= 1
if indegree[node] == 0:
q.append(now)ํ์ด์ฌ์ ๋ฌธ์์ด์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ถ๋ณ์ธ ์๋ฃ๊ตฌ์กฐ์์ ์ ๋ ํ์
๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ๋ผ์ด์ฑ์ด ๊ฐ์ฅ ๋น ๋ฅด๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ์ฐ์ฐ๋ณด๋ค ์ด๋ฅผ ์ฐ์ ์ผ๋ก ํ ๊ฒ
์ด๋ค ๋ฌธ์์ด ์์ ๋ค๋ฅธ ๋ฌธ์์ด์ด ๋ค์ด์๋์ง๋ฅผ O(n+m)์ผ๋ก ์ฐพ์๋ด๋ ์๊ณ ๋ฆฌ์ฆ
๋ฐ๋ณต๋๋ ๋ถ๋ถ์ ๊ฑด๋๋ฐ๋ฉด์ ์ฐพ๋๋ค
๋ฌธ์ ํด๊ฒฐ ๊ธฐ๋ณธ ์์ด๋์ด
- ์์ฐจ์ ์ผ๋ก ๋ ๋ฌธ์์ด T, P๋ฅผ ๋น๊ตํ๋ค ๋ถ์ผ์น๊ฐ ๋ฐ์ํ๋ฉด "์ผ์นํ๋ ๋ถ๋ถ์ ๊ฑด๋๋ฐ๊ณ " ๋ค์ ๋น๊ต
- ๋จ, ์ผ์นํ๋ ๋ถ๋ถ์ ์ ๋ถ ๊ฑด๋๋ฐ์ง๋ ์์
- ์ผ์นํ๋ ๋ถ๋ถ ๋ด์ ๋ฐ๋ณต๋๋ ๋ถ๋ถ์ด ์กด์ฌํ๋ฉด ๊ฑฐ๊ธฐ์๋ถํฐ ์์ํจ
- ๋ฐ๋ณต๋๋ ๋ถ๋ถ์ ์ฐพ๊ธฐ ์ํด ๋น๊ตํ ๋ฌธ์์ด์ธ P์ ๊ฐ ์์น๋ง๋ค ์คํจ ํจ์ ๊ฐ์ ์ค์
- ์คํจ ํจ์๋?
- ๋ถ์ผ์น๊ฐ ๋ฐ์ํ์ ๋ ์ผ๋ง๋งํผ ๊ฑด๋๋ธ์ง ๋ํ๋ด๋ ๊ฐ
- P์ ๋ถ๋ถ ๋ฌธ์์ด์ ๋ํด ํด๋น ๋ฌธ์์ด ๋ด์์ prefix์ suffix๊ฐ ์ผ์นํ๋ ์ต๋ ๊ธธ์ด
- ์ด๊ฑธ LPS(Longest proper Prefix which is Suffix)๋ผ๊ณ ํจ
ํด๊ฒฐ ๋ฐฉ๋ฒ
-
์คํจํจ์ fail[] ์ด ์๋ค๊ณ ํ์ ๋, KMP๋ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌํ ๊ฐ๋ฅ
-
# T์ P๋ฅผ ๋น๊ต j = 0 # T์ P๊ฐ ์ผ์นํ๋ ์ง์ ์ ์ธ๋ฑ์ค๋ฅผ ์ ์ฅ result = [] for i in range(n): # ๋ถ์ผ์น๊ฐ ๋ฐ์ํ๋ฉด fail๊ฐ์ "๋ฐ๋ผ๊ฐ" while j > 0 and T[i] != P[j]: j = fail[j-1] if T[i] == P[j]: # ๋ฌธ์์ด ๋งค์นญ ์ฑ๊ณต if j == m-1: result.append(i-m+2) # ๊ณ์ ํ์: fail๊ฐ์ ๋ฐ๋ผ๊ฐ j = fail[j] else: j += 1
- ์คํจ ํจ์ ๊ฐ์ ๋ฐ๋ผ๊ฐ๋ค๋ ๊ฒ์ ๋ถ์ผ์น๊ฐ ๋ฐ์ํ์ ๋ P๋ฅผ ์ผ๋ง๋ "๋ฐ์ด์ฃผ๋๊ฐ"๋ฅผ ๋ปํจ
- ์คํจํจ์ ๊ฐ์ด 2๋ผ๋ฉด ๋งจ ์ 2๊ธ์==๋งจ ๋ค 2๊ธ์์ด๋ฏ๋ก P์ 3๋ฒ์งธ ๊ธ์๋ถํฐ ๋น๊ต๋ฅผ ์์
j=2๊ฐ ๋จ: ์ฌ๊ธฐ์ 2๋ ๋ถ์ผ์น๊ฐ ๋ฐ์ํ ์ง์ ์ง์ ์ ์คํจํจ์ ๊ฐ์ด๋ฏ๋กj=fail[j-1]์ด ๋๋ค
- if๊ฐ ์๋๋ผ while๋ฌธ์ธ ์ด์ ๋ ์คํจํจ์์ ๊ฐ์ด ํด ๋ "๋ฐ์ด์ค" ์งํ์ ๋ฐ๋ก ๋ถ์ผ์น๊ฐ ๋ฐ์ํ ์ ์๊ธฐ ๋๋ฌธ
- ์คํจ ํจ์ ๊ฐ์ ๋ฐ๋ผ๊ฐ๋ค๋ ๊ฒ์ ๋ถ์ผ์น๊ฐ ๋ฐ์ํ์ ๋ P๋ฅผ ์ผ๋ง๋ "๋ฐ์ด์ฃผ๋๊ฐ"๋ฅผ ๋ปํจ
-
์คํจํจ์๋ P์ P๋ฅผ ๋น๊ตํ๋ KMP๋ก ๊ตฌํ ๊ฐ๋ฅ
-
fail = [0]*(m) j = 0 # i = 0์ผ ๋๋ ์คํจํจ์๊ฐ 0์์ด ์๋ช ํ๋ฏ๋ก pass for i in range(1, m): while j > 0 and P[i] != P[j]: j = fail[j-1] # i๋ฒ์งธ ์ธ๋ฑ์ค๊น์ง์ ๋ฌธ์์ด์์ ํ์ฌ j๊ฐ ์์นํ ์๋ฆฌ์ ๊ธธ์ด(j+1)๊ฐ ์คํจํจ์์ ๊ฐ์ด ๋จ if P[i] == P[j]: # j๋ฅผ ์ค๋ฅธ์ชฝ์ผ๋ก ํ ์นธ ์ด๋ j += 1 fail[i] = j
ํด๊ฒฐ ๊ฐ๋ฅํ ๋๊น์ง ๋ฌธ์ ๋ฅผ ์ชผ๊ฐ๊ณ , ํด๊ฒฐ๋ ๋ฌธ์ ๋ค์ ์กฐํฉํ์ฌ ์๋ ๋ฌธ์ ์ ํด๋ต์ ๋์ถํจ
๋ถํ ์ ๋ณต ๋ฌธ์ ๋ ์ฌ๊ท๋ฅผ ํ์ฉํ์ฌ ํด๊ฒฐํจ
def F(x):
# ์ ๋ณต
if F(x) is soluable:
return solution
# ๋ถํ
else:
x๋ฅผ x1, x2๋ก ๋ถํ
call F(x1)
call F(x2)
return F(x1), F(x2)๋ก F(x)๋ฅผ ๊ตฌํ ๊ฐ