Leetcode Java Generate Parentheses
업데이트:
문제
코드
class Solution {
public List<String> generateParenthesis(int n) {
List<String> list = new ArrayList<>();
this.generate(list, "", 0, 0, n);
return list;
}
private void generate(List<String> list, String str, int left, int right, int n) {
if (str.length() == n * 2) {
list.add(str);
return;
}
if (left < n) {
this.generate(list, this.appendString(str, '('), left + 1, right, n);
}
if (right < left) {
this.generate(list, this.appendString(str, ')'), left, right + 1, n);
}
}
private String appendString(String str, char c) {
return new StringBuilder(str).append(c).toString();
}
}
결과
설명
- 주어진 정수 n의 크기만큼의 올바른 형식의 소괄호 모양을 만들기 위해서 최대 크기부터 재귀 호출을 사용한다.
- 올바른 형식의 최대 크기 소괄호 모양을 만들기 위해서는 ‘(‘ 문자열이 n개부터 시작하는 경우이다.
- 올바른 형식의 최소 크기 소괄호 모양을 만들기 위해서는 ‘(‘ 문자열이 1개부터 시작하는 경우이다.
- 만일 올바른 형식의 소괄호 모양을 저장하는 str의 크기가 주어진 정수 n의 2배일 경우, 결과를 저장하는 배열 list에 추가한다.
- 올바른 형식의 소괄호 문자열은 항상 ‘(‘ 문자열과 ‘)’ 문자열의 개수가 같으므로, 최대 문자열의 길이는 항상 $n \times 2$이어야 한다.
- 변수 left가 주어진 숫자 n보다 작은 경우, ‘(‘ 문자를 문자열 str에 이어쓰고 $left + 1$을 하여 재귀 호출을 반복한다.
- 이 경우, 1번에서 이야기한 ‘(‘ 문자열이 n개부터 시작하는 문자열을 만들기 시작한다.
- 변수 right가 변수 left보다 작은 경우, ‘)’문자를 문자열 str에 이어쓰고 $rigth + 1$을 하여 재귀 호출을 반복한다.
- 이 경우, 1번에서 이야기한 ‘(‘ 문자열이 1개부터 시작하는 문자열을 만들기 시작한다.
- 재귀호출이 완료되면 결과를 저장하는 배열 list를 주어진 문제의 결과로 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기