๐ŸŒžAlgorithm/๐Ÿ”ฅprogrammers

[programmers] ๊ด„ํ˜ธ ๋ณ€ํ™˜ - 2020 KAKAO BLIND RECRUITMENT

๋ฟŒ์•ผ._. 2021. 9. 6. 12:25

์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ ์—ฐ์Šต - 2020 KAKAO BLIND RECRUITMENT


<๊ด„ํ˜ธ ๋ณ€ํ™˜>

๋ฌธ์ œ ์„ค๋ช…

 

์นด์นด์˜ค์— ์‹ ์ž… ๊ฐœ๋ฐœ์ž๋กœ ์ž…์‚ฌํ•œ "์ฝ˜"์€ ์„ ๋ฐฐ ๊ฐœ๋ฐœ์ž๋กœ๋ถ€ํ„ฐ ๊ฐœ๋ฐœ ์—ญ๋Ÿ‰ ๊ฐ•ํ™”๋ฅผ ์œ„ํ•ด
๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž‘์„ฑํ•œ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•˜์—ฌ ๋ฌธ์ œ์ ์„ ๋ฐœ๊ฒฌํ•˜๊ณ  ์ˆ˜์ •ํ•˜๋ผ๋Š” ์—…๋ฌด ๊ณผ์ œ๋ฅผ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ์†Œ์Šค๋ฅผ ์ปดํŒŒ์ผํ•˜์—ฌ ๋กœ๊ทธ๋ฅผ ๋ณด๋‹ˆ ๋Œ€๋ถ€๋ถ„ ์†Œ์Šค ์ฝ”๋“œ ๋‚ด ์ž‘์„ฑ๋œ ๊ด„ํ˜ธ๊ฐ€ ๊ฐœ์ˆ˜๋Š” ๋งž์ง€๋งŒ ์ง์ด ๋งž์ง€ ์•Š์€ ํ˜•ํƒœ๋กœ
์ž‘์„ฑ๋˜์–ด ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
์ˆ˜์ •ํ•ด์•ผ ํ•  ์†Œ์Šค ํŒŒ์ผ์ด ๋„ˆ๋ฌด ๋งŽ์•„์„œ ๊ณ ๋ฏผํ•˜๋˜ "์ฝ˜"์€ ์†Œ์Šค ์ฝ”๋“œ์— ์ž‘์„ฑ๋œ ๋ชจ๋“  ๊ด„ํ˜ธ๋ฅผ ๋ฝ‘์•„์„œ
์˜ฌ๋ฐ”๋ฅธ ์ˆœ์„œ๋Œ€๋กœ ๋ฐฐ์น˜๋œ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด์„ ์•Œ๋ ค์ฃผ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐœ๋ฐœํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 

์šฉ์–ด์˜ ์ •์˜

 

'('์™€ ')' ๋กœ๋งŒ ์ด๋ฃจ์–ด์ง„ ๋ฌธ์ž์—ด์ด ์žˆ์„ ๊ฒฝ์šฐ, '('์˜ ๊ฐœ์ˆ˜์™€ ')'์˜ ๊ฐœ์ˆ˜๊ฐ€ ๊ฐ™๋‹ค๋ฉด
์ด๋ฅผ ๊ท ํ˜•์žกํžŒ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด์ด๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ์— '('์™€ ')'์˜ ๊ด„ํ˜ธ์˜ ์ง๋„ ๋ชจ๋‘ ๋งž์„ ๊ฒฝ์šฐ์—๋Š” ์ด๋ฅผ ์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด์ด๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด, "(()))("์™€ ๊ฐ™์€ ๋ฌธ์ž์—ด์€ "๊ท ํ˜• ์žกํžŒ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด"์ด์ง€๋งŒ "์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด"์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— "(())()"์™€ ๊ฐ™์€ ๋ฌธ์ž์—ด์€ "๊ท ํ˜• ์žกํžŒ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด" ์ด๋ฉด์„œ ๋™์‹œ์— "์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด"์ž…๋‹ˆ๋‹ค.
'('์™€ ')' ๋กœ๋งŒ ์ด๋ฃจ์–ด์ง„ ๋ฌธ์ž์—ด w๊ฐ€ "๊ท ํ˜• ์žกํžŒ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด"์ด๋ผ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณผ์ •์„ ํ†ตํ•ด
"์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด"๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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. ์ƒ์„ฑ๋œ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

"๊ท ํ˜•์žกํžŒ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด" p๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์งˆ ๋•Œ, ์ฃผ์–ด์ง„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ˆ˜ํ–‰ํ•ด 
"์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด"๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒฐ๊ณผ๋ฅผ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด ์ฃผ์„ธ์š”.

 

๋งค๊ฐœ๋ณ€์ˆ˜ ์„ค๋ช…

 

- p๋Š” '('์™€ ')' ๋กœ๋งŒ ์ด๋ฃจ์–ด์ง„ ๋ฌธ์ž์—ด์ด๋ฉฐ ๊ธธ์ด๋Š” 2 ์ด์ƒ 1,000 ์ดํ•˜์ธ ์ง์ˆ˜์ž…๋‹ˆ๋‹ค.
- ๋ฌธ์ž์—ด p๋ฅผ ์ด๋ฃจ๋Š” '('์™€ ')'์˜ ๊ฐœ์ˆ˜๋Š” ํ•ญ์ƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
- ๋งŒ์•ฝ p๊ฐ€ ์ด๋ฏธ "์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด"์ด๋ผ๋ฉด ๊ทธ๋Œ€๋กœ return ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

 

๋ฌธ์ œ ํ’€์ด

   - my solution

def isbalance(p): #๊ท ํ˜•์žก์ธ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด: u,v
    u,v=[],[]
    for i in range(1,len(p)+1):
        if p[:i].count("(") == p[:i].count(")"):
            u=p[:i]
            v=p[i:]
            break
    return u,v

def isright(x): #์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด
    stack=[]
    result=True
    for i in x:
        if i=='(':
            stack.append(i)
        else:
            if len(stack)!=0:
                stack.pop()
            else:
                result=False
    return result

def recur(p):
    answer=''
    if len(p)!=0: # ์ž…๋ ฅ์ด ๋นˆ ๋ฌธ์ž์—ด์ด ์•„๋‹Œ ๊ฒฝ์šฐ
        u,v=isbalance(p) # ๊ท ํ˜•์žกํžŒ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด u,v๋กœ ๋ถ„๋ฆฌ
        if isright(u)==True: # u๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด์ด๋ผ๋ฉด
            answer+=u
            if len(v)!=0:
                answer += recur(v)
        else: # u๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด์ด ์•„๋‹ˆ๋ผ๋ฉด
            answer='('+recur(v)+')'
            x=u[1:len(u)-1] # ์ฒซ๋ฒˆ์งธ์™€ ๋งˆ์ง€๋ง‰ ๋ฌธ์ž ์ œ๊ฑฐ
            for i in x: # ๋‚˜๋จธ์ง€ ๋ฌธ์ž์—ด์˜ ๊ด„ํ˜ธ ๋ฐฉํ–ฅ์„ ๋’ค์ง‘์–ด์„œ ๋ถ™์ด๊ธฐ
                if i=='(':
                    answer+=')'
                else:
                    answer+='('
    return answer
        

def solution(p):
    answer = ''
    answer=recur(p)

    return answer

 

๋ช‡ ๋ฒˆ์ด๋‚˜ ์ด ๋ฌธ์ œ๋ฅผ ๋ดค์—ˆ์ง€๋งŒ ๊ฒ๋จน๊ณ  ๋„์ „ํ•˜์ง€ ์•Š์•˜๋˜ ๋ฌธ์ œ์ด๋‹ค

์ด๋ฒˆ์— ๋ฌธ์ œ๋ฅผ ์ฐจ๊ทผ์ฐจ๊ทผ ์ฝ์–ด๋ดค์ง€๋งŒ ์ฒ˜์Œ์—๋Š” ๋™๊ณต ์ง€์ง„... ๐Ÿ˜ฅ

ํ•˜์ง€๋งŒ ์กฐ๊ธˆ์˜ ํžŒํŠธ๋„ ์–ป์œผ๋ฉด์„œ ๋ฌธ์ œ์— ๋‚˜์™€์žˆ๋Š” ์กฐ๊ฑด์„ ํ•˜๋‚˜์”ฉ ํ•ด๊ฒฐํ•ด๊ฐ€๊ธฐ ์‹œ์ž‘!

 

1) ์•„๋ž˜์™€ ๊ฐ™์ด ํ•จ์ˆ˜๋ฅผ 3๊ฐœ๋กœ ๊ตฌํ˜„

โ‘  ๊ท ํ˜• ์žกํžŒ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด๋กœ ๋ถ„๋ฆฌ โ‘ก ์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด ํŒ๋ณ„ โ‘ข ์กฐ๊ฑด์— ๋งž๊ฒŒ ์žฌ๊ท€๋ฅผ ์œ„ํ•œ ํ•จ์ˆ˜

์กฐ๊ธˆ ๋งŽ์ด ํ•จ์ˆ˜๋ฅผ ๋‚˜๋ˆˆ ๊ฒƒ ๊ฐ™์ง€๋งŒ ์ฐจ๊ทผ์ฐจ๊ทผ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์ œ ๊ธฐ์ค€์— ๋งž์ถฐ ๋‚˜๋ˆ ๋ณด์•˜๋‹ค

 

2) ํ•จ์ˆ˜ ์„ค๋ช…

โ‘  ๊ท ํ˜•์žกํžŒ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด๋กœ ๋ถ„๋ฆฌ: count๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๊ฐœ์ˆ˜๊ฐ€ ๊ฐ™์„ ๋•Œ u, v๋ฅผ ๋ถ„๋ฆฌ

โ‘ก ์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด ํŒ๋ณ„: stack์„ ํ™œ์šฉํ•˜์—ฌ '(' ์ผ ๋•Œ ์ถ”๊ฐ€, ')'์ผ ๋•Œ ์ œ๊ฑฐํ•˜์—ฌ ์˜ฌ๋ฐ”๋ฅธ ๊ด„ํ˜ธ ๋ฌธ์ž์—ด์ธ์ง€ ํŒ๋ณ„

โ‘ข ์กฐ๊ฑด์— ๋งž๊ฒŒ ์žฌ๊ท€๋ฅผ ์œ„ํ•œ ํ•จ์ˆ˜: ๋ฌธ์ œ์—์„œ ๋งํ•œ 1~4์˜ ๊ณผ์ •์„ ๊ตฌํ˜„

 


์ƒ๊ฐ๐Ÿค”

 

๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ ํ›„์— ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๊ณ  ๋น„๊ตํ•ด๋ณด๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์กŒ๋‹ค.

์กฐ๊ธˆ ๋” ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ์ง€๋งŒ, ์˜ค๋Š˜์˜ ๋‚˜๋กœ์„œ๋Š” ์ด๊ฒŒ ์ตœ์„ ์ด์—ˆ๋‹ค๋Š” ์ƒ๊ฐ๋„ ๋“ค์—ˆ๋‹ค.

 

๋‚ด๊ฐ€ ์ƒ๊ฐํ•˜๊ธฐ์— ์ด ๋ฌธ์ œ์˜ ํฌ์ธํŠธ๋Š”

1) ๋ฌธ์ œ๋ฅผ ์ฝ๊ณ  ๋”ฐ๋ผ์„œ ๊ตฌํ˜„ํ•˜๋Š” ๋Šฅ๋ ฅ

์ด์—ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค.


์ถœ์ฒ˜: ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ ์—ฐ์Šต, https://programmers.co.kr/learn/challenges