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 |
Tags
- 몽고 인덱스
- 아키텍쳐 개선
- jwt 표준
- ai agent
- 완전탐색
- 결제서비스
- AWS
- 레디스 동시성
- 트랜잭샨
- 디버깅
- 구현
- 백준
- langgraph
- 크롤링
- BFS
- 쿠키
- 검색어 추천
- 누적합
- 추천 검색 기능
- piplining
- 카카오
- spring event
- docker
- ipo 매매자동화
- next-stock
- 셀러리
- gRPC
- JPA
- 프로그래머스
- 이분탐색
Archives
- Today
- Total
코딩관계론
[프로그래머스] 올바른 괄호의 갯수 본문
반응형
문제 이해하기
n이 주어지면 그 중에 올바른 괄호쌍이 몇 개 있을 수 있는지 찾는 문제였다.
올바른 괄호쌍이란 ()()()와 같이 모두 닫친 괄호를 의미한다.
문제 해결 방법 설명하기
1.가지치기
n이 28(14 * 2)이기 때문에 완전탐색은 제한시간 내에 풀 수 없다. 따라서 시간을 줄이기 위해서 DP를 선택하던가 탐색하지 않아도 실패하는 경우를 발견해서 탐색을 줄여야 한다.
필자는 가지치기를 선택했고, 그 조건에 탐색 시점에서 남은 '(' 의 개수가 남은 ')'의 개수보다 많다면 탐색을 멈추도록 했다. 왜냐하면 닫친 괄호가 더 적게 남았다면 '(())))" 다음과 같은 상황이기 때문이다.
if left_bracket > right_bracket:
return 0
2. 완전탐색
또한 항상 남은 괄호가 정상적인 상황이라면 탐색을 진행해야 함으로 현재 자리에서 왼쪽 괄호를 선택하는 것과 오른쪽 괄호를 선택하는 것 모두 비교해봐야 한다.
if left_bracket:
ans += search(left_bracket -1, right_bracket, n-1)
if right_bracket:
ans += search(left_bracket, right_bracket - 1, n-1)
코드
def search(left_bracket, right_bracket, n):
ans = 0
if left_bracket > right_bracket:
return 0
if left_bracket == 0 and right_bracket == 0:
return 1
if left_bracket:
ans += search(left_bracket -1, right_bracket, n-1)
if right_bracket:
ans += search(left_bracket, right_bracket - 1, n-1)
return ans
def solution(n):
answer = 0
total_bracket = n*2
answer = search(n-1, n, total_bracket)
return answer
if __name__ == "__main__":
n = 3
print(solution(n)) # 2
코드 리뷰
def solution(n):
# 만약 n이 0이면 빈 문자열 하나만 가능하므로 1을 반환합니다.
if n == 0:
return 1
# 동적 계획법을 위한 배열을 초기화합니다.
dp = [0] * (n + 1)
dp[0] = 1 # 0개의 괄호 쌍일 때는 빈 문자열 하나만 가능하므로 1을 설정합니다.
# 1부터 n까지의 각 괄호 쌍에 대해 가능한 경우의 수를 계산합니다.
for i in range(1, n + 1):
# i개의 괄호를 만들기 위해서는 j개의 왼쪽 괄호와 i-1-j개의 오른쪽 괄호가 필요합니다.
for j in range(i):
# dp[j]는 j개의 괄호 쌍으로 만들 수 있는 괄호 문자열의 경우의 수입니다.
# dp[i - 1 - j]는 i-1-j개의 괄호 쌍으로 만들 수 있는 괄호 문자열의 경우의 수입니다.
# 따라서 dp[j] * dp[i - 1 - j]를 모두 더해줍니다.
dp[i] += dp[j] * dp[i - 1 - j]
# n개의 괄호 쌍으로 만들 수 있는 모든 가능한 괄호 문자열의 갯수를 반환합니다.
return dp[n]
# 테스트
print(solution(2)) # 2개의 괄호 쌍으로 만들 수 있는 모든 가능한 괄호 문자열의 갯수는 2입니다. "()()", "(())" 두 가지입니다.
배운점 정리하기
카탈란 수를 이용하면 DP로 변환이 가능하다.
https://m.blog.naver.com/pyw0564/221523147108
카탈란 수(Catalan number)
카탈란 수(Catalan number)란 조합론에서 빈번하게 나타나는 수열입니다. n번째 카탈랑 수를 구한다고하면...
blog.naver.com
반응형
'개발 > 알고리즘' 카테고리의 다른 글
[백준] 암호 만들기 (0) | 2024.05.07 |
---|---|
[카카오] 가사검색 (0) | 2024.05.06 |
[프로그래머스] 방의 개수(미완성) (0) | 2024.04.29 |
[프로그래머스] 정수삼각형 (0) | 2024.04.28 |
[프로그래머스] 연속 펄스 부분 수열의 합 (0) | 2024.04.28 |