Programmers
[프로그래머스 Level.4] 올바른 괄호의 갯수 (연습문제) (Java)
Devtraces
2022. 12. 19. 16:56
문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/12929
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
코딩테스트 연습 > 연습문제 > 올바른 괄호의 갯수
문제 설명
올바른 괄호란 (())나 ()와 같이 올바르게 모두 닫힌 괄호를 의미합니다. )(나 ())() 와 같은 괄호는 올바르지 않은 괄호가 됩니다. 괄호 쌍의 개수 n이 주어질 때, n개의 괄호 쌍으로 만들 수 있는 모든 가능한 괄호 문자열의 갯수를 반환하는 함수 solution을 완성해 주세요.
제한사항
- 괄호 쌍의 개수 N : 1 ≤ n ≤ 14, N은 정수
입출력 예
n | result |
2 | 2 |
3 | 5 |
입출력 예 설명
입출력 예 #1
2개의 괄호쌍으로 [ "(())", "()()" ]의 2가지를 만들 수 있습니다.
입출력 예 #2
3개의 괄호쌍으로 [ "((()))", "(()())", "(())()", "()(())", "()()()" ]의 5가지를 만들 수 있습니다.
나의 코드
class Solution {
int answer;
public int solution(int n) {
answer = 0;
dfs(0, 0, n);
return answer;
}
public void dfs(int open, int close, int n) {
if(open > n || close > n || close > open)
return;
if(open == n && close == n) {
answer++;
return;
}
dfs(open+1, close, n);
dfs(open, close+1, n);
}
}
풀이
- 완전탐색 알고리즘 dfs를 이용하여 해결하면 되는 문제이다.
- 괄호가 잘못 닫히는 경우를 잘 걸러주면서 올바른 괄호가 되도록 만들 수 있는 모든 경우의 수를 구하여 카운팅해주면 된다.
- 올바르지 않은 괄호는 괄호를 열지 않았는데 닫는 괄호가 먼저 나오거나 n개의 괄호쌍인데 괄호가 n개가 넘어가는 경우이다.
- 여는 괄호를 1 추가하고 recursive 호출, 닫는 괄호를 1 추가 recursive 호출하여 모든 경우의 수를 체크하면서 올바르지 않는 경우는 바로 return 하고 정상적으로 괄호가 n개가 되면 카운팅해주고 리턴한다.