문제
나의 풀이
1. 몇몇개 함수로 만들어서: 성공..
def correct_str(x):
a = []
for i in x:
if i == '(':
a.append(i)
else:
if not a:
return False
a.pop()
return True
def balance_str(x):
left, right = 0, 0
for i in range(len(x)):
if x[i] == '(':
left += 1
else:
right += 1
if left == right:
return x[:i + 1], x[i + 1:]
def stage_4_4(x):
x_4_4 = ''
for i in x[1:-1]:
if i == '(':
x_4_4 += ')'
else:
x_4_4 += '('
return x_4_4
answer = ''
def solution(p):
global answer
if not p or correct_str(p):
return p
u, v = balance_str(p)
if correct_str(u):
return u + solution(v)
else:
answer +='(' + solution(v) + ')'+ stage_4_4(u)
return answer
의문점
- correct_str(x)을 '()'를 빼면서 빈문자열로 만드는 방법으로 하면 시간초과가 난다. Why..?
다른 사람 풀이
1. 정석적인 풀이? (프로그래머스)
def isBanlancedString(str):
return str.count('(') == str.count(')')
def isCorrectString(str):
count = 0
for s in str:
if s == '(':
count += 1
else:
count -= 1
if count < 0:
return False
return count == 0
def process(str):
if str == "":
return ""
u, v = splitUV(str)
print(u, v)
if isCorrectString(u):
u += process(v)
return u
else:
newStr = "("
newStr += process(v)
newStr += ")"
if len(u) > 0:
newStr += reverseStr(u[1:-1])
return newStr
def reverseStr(str):
ans = ""
for s in str:
if s == "(":
ans += ")"
else:
ans += "("
return ans
def splitUV(str):
u, v = str, ""
for i in range(2, len(str), 2):
if isBanlancedString(str[:i]):
u = str[:i]
v = str[i:]
break
return u, v
def solution(p):
p = p.strip()
if isCorrectString(p):
return p
return process(p)
2. 숏코딩(프로그래머스)
def solution(p):
if p=='': return p
r=True; c=0
for i in range(len(p)):
if p[i]=='(': c-=1
else: c+=1
if c>0: r=False
if c==0:
if r:
return p[:i+1]+solution(p[i+1:])
else:
return '('+solution(p[i+1:])+')'+''.join(list(map(lambda x:'(' if x==')' else ')',p[1:i]) ))
- 올바른 괄호 자체를 파이썬에서는 True라고 인식
- ''.join(list(map(lambda x:'(' if x==')' else ')',p[1:i]) )) 대신 ''.join(['(' if x==')' else ')' for x in p[1:i]]) 도 가능
- map 또한 iterable이니 list()로 변환하는 과정은 필요 없네요