๐ฉ๐ปโ๐ป๋ฌธ์ ์ค๋ช
[์ด์ฝํ
Ch13-18] ๊ดํธ ๋ณํ (์ฌ๊ท)
โ๏ธIdea Sketch
๋ฌธ์ ์์ฝ
๊ท ํ์กํ ๊ดํธ ๋ฌธ์์ด
: '(' ์ ')' ๋ก๋ง ์ด๋ฃจ์ด์ง ๋ฌธ์์ด์ด ์์ ๊ฒฝ์ฐ, '(' ์ ๊ฐ์์ ')' ์ ๊ฐ์๊ฐ ๊ฐ์ ๊ฒฝ์ฐ
์ฌ๋ฐ๋ฅธ ๊ดํธ ๋ฌธ์์ด
: ๊ท ํ์กํ ๊ดํธ ๋ฌธ์์ด์์ '('์ ')'์ ๊ดํธ์ ์ง๋ ๋ชจ๋ ๋ง๋ ๊ฒฝ์ฐ
๋ชฉํ : ๊ท ํ์กํ ๊ดํธ ๋ฌธ์์ด์ ์ฌ๋ฐ๋ฅธ ๊ดํธ ๋ฌธ์์ด๋ก ๋ณํํ๊ธฐ
- ์ ๋ ฅ์ด ๋น ๋ฌธ์์ด์ธ ๊ฒฝ์ฐ, ๋น ๋ฌธ์์ด์ ๋ฐํํฉ๋๋ค.
- ๋ฌธ์์ด w๋ฅผ ๋ "๊ท ํ์กํ ๊ดํธ ๋ฌธ์์ด" u, v๋ก ๋ถ๋ฆฌํฉ๋๋ค. ๋จ, u๋ "๊ท ํ์กํ ๊ดํธ ๋ฌธ์์ด"๋ก ๋ ์ด์ ๋ถ๋ฆฌํ ์ ์์ด์ผ ํ๋ฉฐ, v๋ ๋น ๋ฌธ์์ด์ด ๋ ์ ์์ต๋๋ค.
- ๋ฌธ์์ด u๊ฐ "์ฌ๋ฐ๋ฅธ ๊ดํธ ๋ฌธ์์ด" ์ด๋ผ๋ฉด ๋ฌธ์์ด v์ ๋ํด 1๋จ๊ณ๋ถํฐ ๋ค์ ์ํํฉ๋๋ค.
3-1. ์ํํ ๊ฒฐ๊ณผ ๋ฌธ์์ด์ u์ ์ด์ด ๋ถ์ธ ํ ๋ฐํํฉ๋๋ค. - ๋ฌธ์์ด u๊ฐ "์ฌ๋ฐ๋ฅธ ๊ดํธ ๋ฌธ์์ด"์ด ์๋๋ผ๋ฉด ์๋ ๊ณผ์ ์ ์ํํฉ๋๋ค.
4-1. ๋น ๋ฌธ์์ด์ ์ฒซ ๋ฒ์งธ ๋ฌธ์๋ก '('๋ฅผ ๋ถ์ ๋๋ค.
4-2. ๋ฌธ์์ด v์ ๋ํด 1๋จ๊ณ๋ถํฐ ์ฌ๊ท์ ์ผ๋ก ์ํํ ๊ฒฐ๊ณผ ๋ฌธ์์ด์ ์ด์ด ๋ถ์ ๋๋ค.
4-3. ')'๋ฅผ ๋ค์ ๋ถ์ ๋๋ค.
4-4. u์ ์ฒซ ๋ฒ์งธ์ ๋ง์ง๋ง ๋ฌธ์๋ฅผ ์ ๊ฑฐํ๊ณ , ๋๋จธ์ง ๋ฌธ์์ด์ ๊ดํธ ๋ฐฉํฅ์ ๋ค์ง์ด์ ๋ค์ ๋ถ์ ๋๋ค.
4-5. ์์ฑ๋ ๋ฌธ์์ด์ ๋ฐํํฉ๋๋ค.
์๊ฐ๋ณต์ก๋
O(n)
์๊ณ ๋ฆฌ์ฆ : ์ฌ๊ท ํจ์ ๊ตฌํ
์ฌ๊ท ํจ์ ๊ตฌํ์ ์๊ตฌํ๋ ๋ฌธ์ ์ด๋ค. ์ฌ๊ท ํจ์ ๊ตฌํ์ DFS ์๊ณ ๋ฆฌ์ฆ์ ํต์ฌ์ด ๋๊ธฐ ๋๋ฌธ์, ๊ต์ฌ์์ DFS/BFS ํํธ๋ก ๋ถ๋ฅ๋์๋ค.
โ๏ธ๋ด ์์ค์ฝ๋
#1 : ์ ๋ ฅ์ด ๋น ๋ฌธ์์ด์ธ ๊ฒฝ์ฐ, ๋น ๋ฌธ์์ด์ ๋ฐํํ๋ค.
#for๋ฌธ : ๋ฌธ์์ด w๋ฅผ ๋ ๊ท ํ์กํ ๊ดํธ ๋ฌธ์์ด u, v๋ก ๋ถ๋ฆฌํด์ผํ๋ค. ๋ฌธ์์ด์ ๋ถ๋ฆฌํ๋ ๊ธฐ์ค์ ๊ตฌํด์ผ ํ๋ค. ์ด๋ฆฐ ๊ดํธ์ ๋ซํ ๊ดํธ์ ๊ฐ์๊ฐ ๋๊ฐ์์ง๋ idx
๋ฅผ ๊ตฌํ๋ฉด ๊ท ํ์กํ ๊ดํธ ๋ฌธ์์ด w๋ฅผ ๊ตฌํ ์ ์๋ค.
#2 : idx๋ฅผ ๊ธฐ์ค์ผ๋ก, ๋ฌธ์์ด w๋ฅผ ๋ ๊ท ํ์กํ ๊ดํธ ๋ฌธ์์ด u, v๋ก ๋ถ๋ฆฌํ๋ค.
#3 : ๋ฌธ์์ด u๊ฐ ์ฌ๋ฐ๋ฅธ ๊ดํธ ๋ฌธ์์ด์ด๋ฉด, ๋ฌธ์์ด v์ ๋ํด ์ฌ๊ท ํจ์๋ฅผ ํธ์ถํ๋ค. ๋ฌธ์์ด u๊ฐ ์ฌ๋ฐ๋ฅธ ๊ดํธ ๋ฌธ์์ด์ธ์ง ํ์ธํด์ผํ๋ค. ๋ฌธ์์ด u๋ ํญ์ ๊ท ํ์กํ ๊ดํธ ๋ฌธ์์ด์ด๋ค. ๋ฐ๋ผ์ ์ธ๋ฑ์ค 0์ ๊ฐ์ด ์ด๋ฆฐ ๊ดํธ (
๋ฉด, ํญ์ ์ฌ๋ฐ๋ฅธ ๊ดํธ ๋ฌธ์์ด์ด๋ค.
return u + recursion(v)
#4 : ๋ฌธ์์ด u๊ฐ ์ฌ๋ฐ๋ฅธ ๊ดํธ ๋ฌธ์์ด์ด ์๋๋ฉด, ๋ค์์ ๊ณผ์ ์ ์ํํ๋ค.
(๋ฅผ ๋ถ์ธ๋ค
+๋ฌธ์์ด v์ ๋ํด ์ฌ๊ท ํจ์๋ฅผ ํธ์ถํ๋ค
+)๋ฅผ ๋ถ์ธ๋ค
+temp๋ฅผ ๋ถ์ธ๋ค
- temp : string slice
u[1:-1]
๋ก ์ฒซ๋ฒ์งธ์ ๋ง์ง๋ง ๋ฌธ์๋ฅผ ์ ๊ฑฐํ๊ณ , for๋ฌธ์ผ๋ก ๊ดํธ ๋ฐฉํฅ์ ๋ค์ง๋๋ค.
return '(' + recursion(v) + ')' + temp
์ ์ฒด ์ฝ๋
def solution(p):
return recursion(p)
def recursion(w):
if w == '': # 1
return ''
cnt_open = 0
cnt_close = 0
idx = len(w)
for i in range(len(w)):
if cnt_open == cnt_close > 0:
idx = i
break
if w[i] == '(':
cnt_open += 1
elif w[i] == ')':
cnt_close += 1
u = w[:idx] # 2
v = w[idx:]
if w[0] == '(': # 3
return u + recursion(v)
else: # 4
temp = ''
for x in u[1:-1]:
if x == ')':
temp += '('
else:
temp += ')'
return '(' + recursion(v) + ')' + temp