Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 파이썬
- SQL
- C언어
- Lv. 2
- 오블완
- softeer
- 깊이 우선 탐색
- bfs
- javascript
- 프로그래머스
- 너비 우선 탐색
- Java
- Lv. 0
- 티스토리챌린지
- LEVEL 2
- group by
- dfs
- 동적계획법
- SQL 고득점 KIT
- 자바스크립트
- DP
- Lv. 3
- select
- join
- programmers
- 소프티어
- Python
- Lv. 1
- level 3
- Dynamic Programming
Archives
- Today
- Total
몸과 마음이 건전한 SW 개발자
프로그래머스 [Lv. 2] 괄호 변환 {언어 : Python} [다시 풀어 보기] 본문
문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/60058
정답 코드
answer = ""
def solution(p):
global answer
def isValid(uvp):
stack = []
lenUVP = len(uvp)
for i in range(lenUVP):
cv = uvp[i]
if cv == "(":
stack.append(cv)
else:
if stack:
if stack[-1] == "(":
stack.pop()
else:
stack.append(cv)
else:
return False
if stack:
return False
else:
return True
def checkUV(w):
if not w:
return ""
lenW = len(w)
idx = 0
balance = 0
for s in range(lenW):
if w[s] == "(":
balance += 1
else:
balance -= 1
if balance == 0:
idx = s + 1
break
u = w[:idx]
v = w[idx:]
if isValid(u):
return u + checkUV(v)
else:
tmp = "("
tmp += checkUV(v)
tmp += ")"
for s in u[1:len(u)-1]:
if s == '(':
tmp += ')'
else:
tmp += '('
return tmp
answer = checkUV(p)
return answer
풀이 방법
- 핵심은 u와 v를 나누는 방법과 괄호가 유효한지 확인하는 방법이다.
- u와 v를 나눌 때 밸런스만 맞으면 u로 나머지는 v로 한다.
- u의 괄호가 유효하든 아니든 v는 재귀를 돌리고 u가 유효하지 않으면 괄호의 방향을 돌린다.
- 마지막으로 반환된 값들이 합쳐지면서 나온 answer를 반환하면 끝!
느낀점
- 이런 문제 나오면 틀릴 것 같아서 다시 풀어보면 좋겠다고 생각한 문제다.
'알고리즘 > 다시 풀어 보기' 카테고리의 다른 글
프로그래머스 [Lv. 2] 조이스틱 {언어 : Python} [다시 풀어 보기] (0) | 2024.05.17 |
---|---|
프로그래머스 [Lv. 2] 구명보트 {언어 : JavaScript} [다시 풀어 보기] (0) | 2024.05.09 |
프로그래머스 [Lv. 2] 빛의 경로 사이클 {언어 : JavaScript} [다시 풀어 보기] (2) | 2024.05.01 |
프로그래머스 [Lv. 2] 마법의 엘리베이터 {언어 : JavaScript} [다시 풀어 보기] (0) | 2024.04.18 |
프로그래머스 [Lv. 2] 시소 짝꿍 {언어 : Python} [다시 풀어 보기] (0) | 2024.04.18 |