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
- mysql boolean
- 해커톤
- Type Challenge
- TypeScript 타입챌린지
- 스터디
- 회고록
- nestjs
- 와글와글
- configmodule
- 백엔드
- TypeScript
- type-safe configservice
- typescript type challenge
- 타입챌린지
- HTTP
- 코딩테스트
- configservice
- 이펙티브 타입스크립트
- typeorm
- 굿바이 2024년
- network
- 회고
- 타입스크립트
- 월간cs
- microsoft azure openai
- mysql
- 타입 챌린지
- 2024년 회고록
- node.js
- npm
Archives
- Today
- Total
iamkanguk.dev
[프로그래머스] LV2: 괄호 변환 본문
문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/60058
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
풀이
def isRight(p): # 문자열 p가 올바른 괄호 문자열인지 확인하는 함수
stack = []
for i in p:
if i == '(':
stack.append(i)
else:
if not stack:
return False
stack.pop()
return True if not stack else False
def splitToUAndV(p): # 문자열 p를 u와 v로 분리 (u는 균형잡힌 괄호 문자열, v는 나머지)
openBracketCount, closeBracketCount = 0, 0
for idx, w in enumerate(p):
if w == '(':
openBracketCount += 1
else:
closeBracketCount += 1
if openBracketCount == closeBracketCount:
return p[:idx+1], p[idx+1:]
def solution(p):
if not p: # 1. 빈 문자열인 경우 그대로 빈 문자열 반환
return p
u, v = splitToUAndV(p) # 2. 문자열을 u와 v로 분리
if isRight(u) == True: # 3. 문자열이 올바른 괄호 문자열이라면
return u + solution(v) # 3-1. v에 대해 1단계부터 다시 수행
else: # 4. 문자열 u가 올바른 괄호 문자열이 아닌 경우
answer = '(' # 4-1. (를 붙임
answer += solution(v) # 4-2. 문자열 v에 대해 1단계부터 재귀적으로 수행한 결과 붙임
answer += ')' # 4-3. )를 붙임
for i in u[1:len(u)-1]: # 4-4. u의 첫번째와 마지막 문자를 제거하고 나머지 문자열의 괄호 방향 뒤집음
if i == '(':
answer += ')'
else:
answer += '('
return answer # 4-5. 반환
풀이 해석
- 빈 문자열인 경우 바로 반환해준다.
- splitToUAndV 메서드로 문자열을 u와 v로 분리해준다. 필자는 반복문과 enumerate 메서드를 통해 (의 개수와 )의 개수를 세어가며 같을 경우에 바로 메서드를 끝냈다. 왜냐면 균형잡힌 문자열이기 때문이다.
- isRight 메서드를 통해 올바른 문자열인지 확인한다. isRight 메서드는 stack을 활용해서 확인을 해준다. 핵심은 ) 가 나오면 stack에 (가 있는지 확인하고 있으면 pop을 해주면 된다. 만약 (가 없는 상태에서 )가 온다면 올바른 괄호 문자열이 아니다.
- 올바른 문자열이면 v를 1단계부터 수행하라고 했으니까 solution 메서드를 그대로 재귀로 호출해준다.
- u가 올바른 문자열이 아니면 문제에 나와있는대로 천천히 따라하면 된다 (이건 쉬운듯^_^)
후기
개인적으로 문제가 어렵진 않았는데? 재귀쪽을 처리하는건 조금 힘들었던 것 같다.
한 80% 정도는 다 풀었는데 시간을 너무 쓰는거 같아서 다른분들의 풀이를 조금 참고해서 마무리를 지었다.