[Programmers] ๊ดํธ ๋ณํ
Updated:
๊ดํธ ๋ณํ
๊ดํธย ๋ณํ ์ ํด๋ฆญํ๋ฉด ๋ฐ๋ก ์ด๋ํ๋ค.
์ด ๋ฌธ์ ๋ โ(โ, โ)โ ๋ก๋ง ์ด๋ฃจ์ด์ง ๋ฌธ์์ด์ด ์ฃผ์ด์ก์ ๋ ์ง์ ๋ง๊ฒ ์ฌ๋ฐ๋ฅธ ๊ดํธ ๋ฌธ์์ด์ ๋ง๋ค์ด ๋ฐํํ๋ ๋ฌธ์ ์ด๋ค.
์๋ฅผ๋ค์ด โ)(โ ๊ฐ ์ฃผ์ด์ง๋ค๋ฉด โ()โ ๋ก ๋ฐํํด์ผ ํ๋ค.
๊ทธ๋ฐ๋ฐ ํน์ดํ๊ฒ ์๊ณ ๋ฆฌ์ฆ์ ์ ๋ถ ์๋ ค์ค๋ค.
์ฐ๋ฆฌ๋ ๋ณด๊ณ ์ฝ๋๋ก ์ฎ๊ธฐ๊ธฐ๋ง ํ๋ฉด ๋๋ค.
'''
1. ์
๋ ฅ์ด ๋น ๋ฌธ์์ด์ธ ๊ฒฝ์ฐ, ๋น ๋ฌธ์์ด์ ๋ฐํํฉ๋๋ค.
2. ๋ฌธ์์ด w๋ฅผ ๋ "๊ท ํ์กํ ๊ดํธ ๋ฌธ์์ด" u, v๋ก ๋ถ๋ฆฌํฉ๋๋ค. ๋จ, u๋ "๊ท ํ์กํ ๊ดํธ ๋ฌธ์์ด"๋ก ๋ ์ด์ ๋ถ๋ฆฌํ ์ ์์ด์ผ ํ๋ฉฐ, v๋ ๋น ๋ฌธ์์ด์ด ๋ ์ ์์ต๋๋ค.
3. ๋ฌธ์์ด u๊ฐ "์ฌ๋ฐ๋ฅธ ๊ดํธ ๋ฌธ์์ด" ์ด๋ผ๋ฉด ๋ฌธ์์ด v์ ๋ํด 1๋จ๊ณ๋ถํฐ ๋ค์ ์ํํฉ๋๋ค.
3-1. ์ํํ ๊ฒฐ๊ณผ ๋ฌธ์์ด์ u์ ์ด์ด ๋ถ์ธ ํ ๋ฐํํฉ๋๋ค.
4. ๋ฌธ์์ด u๊ฐ "์ฌ๋ฐ๋ฅธ ๊ดํธ ๋ฌธ์์ด"์ด ์๋๋ผ๋ฉด ์๋ ๊ณผ์ ์ ์ํํฉ๋๋ค.
4-1. ๋น ๋ฌธ์์ด์ ์ฒซ ๋ฒ์งธ ๋ฌธ์๋ก '('๋ฅผ ๋ถ์
๋๋ค.
4-2. ๋ฌธ์์ด v์ ๋ํด 1๋จ๊ณ๋ถํฐ ์ฌ๊ท์ ์ผ๋ก ์ํํ ๊ฒฐ๊ณผ ๋ฌธ์์ด์ ์ด์ด ๋ถ์
๋๋ค.
4-3. ')'๋ฅผ ๋ค์ ๋ถ์
๋๋ค.
4-4. u์ ์ฒซ ๋ฒ์งธ์ ๋ง์ง๋ง ๋ฌธ์๋ฅผ ์ ๊ฑฐํ๊ณ , ๋๋จธ์ง ๋ฌธ์์ด์ ๊ดํธ ๋ฐฉํฅ์ ๋ค์ง์ด์ ๋ค์ ๋ถ์
๋๋ค.
4-5. ์์ฑ๋ ๋ฌธ์์ด์ ๋ฐํํฉ๋๋ค.
'''
[2021.03.04] ๋ณต์ต
def is_collect(u):
stack = []
for i in u:
if i == '(':
stack.append('(')
if i == ')':
try:
stack.pop()
except IndexError:
return False
if stack:
return False
return True
def split_U_V(p):
u, v = '', ''
left, right = 0, 0
for i in p:
if i == '(':
left += 1
elif i == ')':
right += 1
if left == right:
return p[:left * 2], p[left * 2:]
def solution(p):
if not p:
return p
u, v = split_U_V(p)
if is_collect(u):
return u + solution(v)
else:
empty = '(' + solution(v) + ')'
u = u[1:-1]
u = u.replace('(', '0')
u = u.replace(')', '1')
u = u.replace('0', ')')
u = u.replace('1', '(')
return empty + u
if __name__ == '__main__':
p = input()
print(solution(p))
def make_u_v(p): # ๋ฌธ์์ด w๋ฅผ ๋ '๊ท ํ์กํ ๊ดํธ ๋ฌธ์์ด' u, v๋ก ๋ถ๋ฆฌํ๋ ํจ์
left_cnt = 0
right_cnt = 0
for val in p:
if val == '(':
left_cnt += 1
elif val == ')':
right_cnt += 1
if left_cnt == right_cnt:
u = p[:left_cnt + right_cnt]
v = p[left_cnt + right_cnt:len(p)]
break
return u, v
def is_collect(p): # ์ฌ๋ฐ๋ฅธ ๊ดํธ ๋ฌธ์์ด์ธ์ง ์ฌ๋ถ๋ฅผ ๋ฐํํ๋ ํจ์
_stack = list()
for val in p:
try:
if val == '(':
_stack.append(val)
elif val == ')':
_stack.pop()
except IndexError:
return False
if _stack:
result = False
else:
result = True
return result
def solution(p):
if not p:
return p
u, v = make_u_v(p)
if is_collect(u):
return u + solution(v)
else:
tmp = '(' + solution(v) + ')'
u = u[1:-1]
u = u.replace('(', '0')
u = u.replace(')', '1')
u = u.replace('0', ')')
u = u.replace('1', '(')
return tmp + u
์ฌ๋ฐ๋ฅธ ๊ดํธ์ธ์ง ํ๋จ ํด์ฃผ๋ ํจ์, ๋ฌธ์์ด w ๋ฅผ u, v ๋ก ๋๋์ด์ฃผ๋ ํจ์, ๋ฉ์ธ ์ฌ๊ทํจ์ ์ด ์ธ ๊ฐ์ง ํจ์๋ฅผ ๋ง๋ค์๋ค.
-
์ฌ๋ฐ๋ฅธ ๊ดํธ์ธ์ง ํ๋จํด์ฃผ๋ ํจ์๋ ์ด๋ฆผ ๊ดํธ๋ฅผ ์คํ์ ๋ฃ๊ณ ๋ซํ ๊ดํธ๊ฐ ๋์ฌ ๋ ๋ง๋ค pop ์ ํด์ฃผ์๋ค.
์ด๋, ๋ซํ ๊ดํธ๊ฐ ๋์๋๋ฐ ์คํ์ด ๋น์ด์๊ฑฐ๋ ๋ชจ๋ ๊ดํธ๋ฅผ ๋ฐ๋ณต ํ ์คํ์ด ๋น์ด์์ง์์ผ๋ฉด ์ฌ๋ฐ๋ฅด์ง ์์ ๊ดํธ์ด๋ค.
-
๋ฌธ์์ด w ๋ฅผ u, v ๋ก ๋๋์ด์ฃผ๋ ํจ์๋ ์ด๋ฆผ, ๋ซํ ๊ดํธ ๊ฐ์๋ฅผ ์ธ์ฃผ๋ฉด์ ๊ฐ์๊ฐ ๊ฐ์ ๊ฒฝ์ฐ ๊ดํธ ๊ฐ์๋งํผ ์๋ผ u๋ฅผ ๋ง๋ค๊ณ
๋๋จธ์ง๋ฅผ v ๋ก ๋ง๋ค์ด ์ค๋ค. u ๋ ๋์ด์ ๊ท ํ์กํ ๊ดํธ๋ก ๋๋ ์ ์๊ธฐ ๋๋ฌธ์ ์ฒ์ ๊ดํธ ๊ฐ์๊ฐ ๊ฐ์์ง๋ ์๋ฅด๊ณ ๋ฉ์ถ๋ค.
-
๋ฉ์ธ ์ฌ๊ทํจ์๋ ์ ๋ง ์ฃผ์ด์ง ์๊ณ ๋ฆฌ์ฆ ๋๋ก ์ง๋ฉด ๋๋ค. ๋ฌธ์์ด์ด ๋น์ด์๋ค๋ฉด ๋น์ด์๋ ๋ฌธ์์ด์ ๋ฐํํ๊ณ
u, v ๋ฅผ ๋ง๋ค์ด u ๊ฐ ์ฌ๋ฐ๋ฅธ ๊ดํธ๋ผ๋ฉด v ๋ฅผ ๋ค์ ๋ฐ๋ณตํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ u ์ ๋ถ์ด๊ณ ..
u ๊ฐ ์ฌ๋ฐ๋ฅด์ง ์์ ๊ดํธ๋ผ๋ฉด ์ฃผ์ด์ง ๋ฐฉ๋ฒ์ ๊ทธ๋๋ก ํ๋ฉด ๋๋ค.
ํ์ง๋ง ์ฌ๊ธฐ์ ์ฐฉ๊ฐํ๋ ๋ถ๋ถ์ด ์๋๋ฐ ๋ฐ๋ก
4-4. u์ ์ฒซ ๋ฒ์งธ์ ๋ง์ง๋ง ๋ฌธ์๋ฅผ ์ ๊ฑฐํ๊ณ , ๋๋จธ์ง ๋ฌธ์์ด์ ๊ดํธ ๋ฐฉํฅ์ ๋ค์ง์ด์ ๋ค์ ๋ถ์ ๋๋ค.
์ด ๋ถ๋ถ์ด๋ค. ์ฒ์์๋ ๊ดํธ ๋ฐฉํฅ์ ๋ค์ง์ด์ ๋ค์ ๋ถ์ธ๋ค๋ ์๋ฏธ๊ฐ u[::-1] ๋ก ํด์ ๋ถ์ด๋ผ๋ ์๋ฏธ์ธ ์ค ์์๋ค.
ํ์ง๋ง ๋ฌธ์์ด์ ๋ค์ง๋๊ฒ ์๋๋ผ ๊ดํธ ๋ฐฉํฅ์ ๋ค์ง๋ ๊ฒ ์ด์๋ค.
๊ทธ๋์ replace ๋ฅผ ํตํด ์ด๋ฆผ, ๋ซํ์ ๋ฐ๋๋ก ๋ฐ๊พธ์ด์คฌ๋ค.
Leave a comment