일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 1차원 DP
- 2차원 dp
- 99클럽
- @BeforeAll
- @BeforeEach
- @Builder
- @Entity
- @GeneratedValue
- @GenericGenerator
- @NoargsConstructor
- @Query
- @Table
- @Transactional
- Actions
- Amazon EFS
- amazon fsx
- Android Studio
- ANSI SQL
- api gateway 설계
- api gateway 필터
- ApplicationEvent
- assertThat
- async/await
- AVG
- AWS
- aws autoscaling
- aws eks
- AWS KMS
- aws 연동
- AWS 프리티어
- Today
- Total
기록
프로그래머스_python_올바른 괄호의 갯수 본문
문제
https://programmers.co.kr/learn/courses/30/lessons/12929
코딩테스트 연습 - 올바른 괄호의 갯수
올바른 괄호란 (())나 ()와 같이 올바르게 모두 닫힌 괄호를 의미합니다. )(나 ())() 와 같은 괄호는 올바르지 않은 괄호가 됩니다. 괄호 쌍의 개수 n이 주어질 때, n개의 괄호 쌍으로 만들 수 있는 모
programmers.co.kr
풀이
1. 접근하기
괄호쌍 2개를 이용한다고 할때, 아래와 같다.
- 탐색하기
문자열 뒤에 "("을 붙인다.
올바른 괄호쌍이라면, 탐색을 계속한다.
문자열 뒤에 ")"을 붙인다.
올바른 괄호쌍이라면, 탐색을 계속한다.
- 올바른 괄호쌍
")"의 개수가 "("보다 많지 않다.
2. 시간초과
- '('의 개수 기록하기
# "("의 개수를 기록하지 않음
def solution(n):
answer = 0
stack = [(1, 1)]
while stack :
size, check = stack.pop()
if size==2*n :
if check==0 : answer += 1
continue
# add "("
if 0<=check+1<=n :
stack.append((size+1, check+1))
# add ")"
if 0<=check-1<=n :
stack.append((size+1, check-1))
return answer
# "("의 개수를 기록함
# "("의 개수가 순서쌍의 개수n보다 커지지 않도록 체크
def solution(n):
answer = 0
stack = [(1, 1, 1)]
while stack :
size, check, count = stack.pop()
if size==2*n :
if check==0 : answer += 1
continue
# add "("
if 0<=check+1<=n and count+1<=n:
stack.append((size+1, check+1, count+1))
# add ")"
if 0<=check-1<=n and count<=n:
stack.append((size+1, check-1, count))
return answer
"("의 개수를 저장하기 전에는 마지막 케이스에서 시간초과 오류가 있었지만, "("가 괄호쌍의 개수보다 많은 경우를 탐색에서 제외하였더니 모든 케이스에서 통과할 수 있었다.

- 문자열 사용하지 않고 표현하기
# 문자열을 이용한 풀이
def solution(n):
answer = 0
stack = [('(', 1, 1)]
while stack :
token, check, count = stack.pop()
if len(token)==2*n :
if check==0 : answer += 1
continue
if 0<=check+1<=n and count+1<=n:
stack.append((token+'(', check+1, count+1))
if 0<=check-1<=n and count<=n:
stack.append((token+')', check-1, count))
return answer
괄호쌍의 개수가 1 ≤ n ≤ 14로 문자열의 크기가 크지 않아서, 실행시간이 크게 줄어들지는 않았다.

3. 다른 풀이
- 카탈란(카탈랑) 수
문자열을 첫 괄호, 나머지 괄호로 나눈다.
첫번째 괄호를 기준으로 내부 괄호의 수와 외부 괄호의 수를 곱한다.
3쌍의 괄호라면, 아래가 표가 성립한다.
내부 괄호의 수 | 외부 괄호의 수 | 예시 |
2 | 0 | ((())) , (()()) |
1 | 1 | (())() |
0 | 2 | ()(()), ()()() |
https://ko.wikipedia.org/wiki/%EC%B9%B4%ED%83%88%EB%9E%91_%EC%88%98
카탈랑 수 - 위키백과, 우리 모두의 백과사전
비슷한 이름의 카탈랑 상수에 관해서는 해당 문서를 참조하십시오. 조합론에서, 카탈랑 수(Catalan數, 영어: Catalan number)는 이진 트리의 수 따위를 셀 때 등장하는 수열이다. 카탈랑 수 C : N → N {\di
ko.wikipedia.org
코드
def solution(n):
answer = 0
stack = [(1, 1, 1)] # 문자열의 len, "("개수-")"개수, "("의 개수
while stack :
size, check, count = stack.pop()
if size==2*n :
if check==0 : answer += 1
continue
# add "("
if 0<=check+1<=n and count+1<=n:
stack.append((size+1, check+1, count+1))
# add ")"
if 0<=check-1<=n and count<=n:
stack.append((size+1, check-1, count))
return answer
'코딩테스트 > python' 카테고리의 다른 글
프로그래머스_python_도둑질 (0) | 2022.01.10 |
---|---|
프로그래머스_아이템 줍기 (0) | 2022.01.08 |
프로그래머스_python_최적의 행렬 곱셈 (0) | 2021.12.29 |
프로그래머스_python_섬 연결하기 (0) | 2021.12.29 |
프로그래머스_python_배달 (0) | 2021.12.27 |