[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 ๋ฅผ ํ†ตํ•ด ์—ด๋ฆผ, ๋‹ซํž˜์„ ๋ฐ˜๋Œ€๋กœ ๋ฐ”๊พธ์–ด์คฌ๋‹ค.


Categories:

Updated:

Leave a comment