๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Algorithm/ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ๊ด„ํ˜ธ ๋ณ€ํ™˜ (Python)

1. ๋ฌธ์ œ ์„ค๋ช…

๋ฌธ์ œ ๋งํฌ

  • ์ž…๋ ฅ :
    • ๊ท ํ˜•์žกํžŒ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด: '(' ์˜ ๊ฐœ์ˆ˜์™€ ')' ์˜ ๊ฐœ์ˆ˜๊ฐ€ ๊ฐ™์€ ๋ฌธ์ž์—ด
  • ์ถœ๋ ฅ :
    • ์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด : ๊ท ํ˜•์žกํžŒ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด์ด๋ฉด์„œ '('์™€ ')'์˜ ๊ด„ํ˜ธ์˜ ์ง๋„ ๋ชจ๋‘ ๋งž๋Š” ๋ฌธ์ž์—ด

2. ์ฝ”๋“œ

solution1.py

def split_to_uv(p):
    stack = []
    left = 0
    right = 0
    correct = True #์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด์ธ์ง€ ๊ฒ€์‚ฌ

    for i,pp in enumerate(p):
        if pp == '(':
            left+=1
            stack.append('(')
        else:
            right+=1
            if len(stack) == 0: #์Šคํƒ์ด ๋น„์–ด์žˆ์œผ๋ฉด, ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์€ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด
                correct = False
            else: #์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด์ด๋ฉด
                stack.pop()
        if left == right: #๊ท ํ˜•์žกํžŒ ๋ฌธ์ž์—ด์ด ์™„์„ฑ๋˜๋Š” ์ˆœ๊ฐ„
            return i+1, correct #v์˜ ์‹œ์ž‘ ์ธ๋ฑ์Šค, u์˜ ์˜ฌ๋ฐ”๋ฅธ๊ด„ํ˜ธ๋ฌธ์ž์—ด์—ฌ๋ถ€ ์ „๋‹ฌ


def solution(p):
    #1
    if len(p) == 0:
        return p
    #2
    v_idx, u_correct = split_to_uv(p)
    u = p[:v_idx]
    v = p[v_idx:]
    #3
    if u_correct == True:
        #3-1
        return u + solution(v)
    #4
    else:
        #4-1, 4-2, 4-3
        answer = '(' + solution(v) + ')'
        #4-4
        for i in range(1,len(u)-1):
            if u[i] == '(':
                answer+=')'
            else:
                answer+='('
        #4-5
        return answer

3. ํšŒ๊ณ 

  • ์ฒ˜์Œ์— ๋ฌธ์ œ ์†์— ์ ํžŒ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ œ๋Œ€๋กœ ๋ณด์ง€์•Š๊ณ , input, output๋งŒ ๋ณด๊ณ  ์ง์ ‘ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ํ–ˆ์—ˆ๋‹ค.
  • ๋ฌธ์ œ๋ฅผ ์ž˜ ์ฝ์ž..!
  • ๋‹ค๋ฅธ๊ฑด ๊ทธ๋Œ€๋กœ ๊ตฌํ˜„ํ•˜๋ฉด ๋˜๊ณ , split_to_uv ๋Š” u,v๋ฅผ ๋ถ„๋ฆฌ์™€ ์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด์ธ์ง€ ํ•จ๊ป˜ ์ฒดํฌํ•ด์•ผํ•œ๋‹ค.
  • ์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด์ธ์ง€ ํŒ๋‹จํ•˜๋Š” ๊ธฐ์ค€์€ '(' ๊ฐ€ ๋‚˜์˜ค๋ฉด stack์— ๋„ฃ์–ด์ฃผ๊ณ , ')'๊ฐ€ ๋‚˜์™”์„ ๋•Œ, ์Šคํƒ์ด ๋น„์–ด์žˆ๋Š”์ง€ ์•„๋‹Œ์ง€ ์ฒดํฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๋น„์–ด์žˆ๋‹ค๋ฉด ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์€ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด!
  • ์ฒ˜์Œ์— split_to_uv()๋ฅผ ์ฒ˜์Œ ํ˜ธ์ถœํ•˜์ž๋งˆ์ž u์™€ v ๋‘˜๋‹ค ๊ท ํ˜•์žกํžŒ ๋ฌธ์ž์—ด์ด ๋˜์–ด์•ผํ•˜๋Š” ์ค„ ์•Œ์•˜๋Š”๋ฐ, 3๋ฒˆ์— "๋ฌธ์ž์—ด u๊ฐ€ "์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด" ์ด๋ผ๋ฉด ๋ฌธ์ž์—ด v์— ๋Œ€ํ•ด 1๋‹จ๊ณ„๋ถ€ํ„ฐ ๋‹ค์‹œ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. " ๋ฅผ ํ†ตํ•ด ์ฒ˜์Œ ํ˜ธ์ถœํ–ˆ์„ ๋•Œ๋Š” u๋งŒ ๊ท ํ˜•์žกํžŒ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด์ด ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋‹ค.
  • ์ด ๋ฌธ์žฅ์„ ํ†ตํ•ด split_to_uv()์—์„œ๋Š” u๊ฐ€ ๊ท ํ˜•์žกํžŒ ๋ฌธ์ž์—ด์ด๋ผ๊ณ  ํŒ๋‹จ๋œ ์ˆœ๊ฐ„์— return ํ•˜๋ฉด ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
  • u๊ฐ€ ๊ท ํ˜•์žกํžŒ ๋ฌธ์ž์—ด์ด ๋˜๊ธฐ ์œ„ํ•œ ๊ธฐ์ค€์€ left, right ๊ด„ํ˜ธ๊ฐ€ ์„œ๋กœ ๊ฐœ์ˆ˜๊ฐ€ ์ผ์น˜ํ•˜๋Š” ์ฒซ ์ˆœ๊ฐ„์ด๋‹ค.

4. Reference

https://www.youtube.com/watch?v=Y-Xpiqsx8Hc