saurus2
Saurus2
saurus2
전체 방문자
오늘
어제
  • 분류 전체보기
    • 개발
      • AJAX
    • ML Ops
    • Profile
    • 음식점
    • 배낭여행
    • 컴퓨터공학
      • 알고리즘 공부
      • C++
      • Sever 스터디
      • Java spring
      • 알고리즘 _ 문제해결
      • 딥러닝
      • Java 정리
      • Python
      • LeetCode 1000
      • Machine Learning Study
      • Sign language Detection Pro..
      • LeetCode Solutions
    • 비콘
    • 데일리 리포트
    • 유학일기
      • 영어 공부
      • Daily
    • AI Master Degree
      • Data Mining
      • AI and Data engineering
      • Math Foundations for Decisi..
      • Natural Language Processing

블로그 메뉴

  • 홈
  • 태그
  • 미디어로그
  • 위치로그
  • 방명록

공지사항

인기 글

태그

  • 온라인저지
  • DFS
  • c++
  • 딥러닝
  • 딕셔너리
  • 백준
  • 파이썬
  • two pointer
  • Python
  • 취업준비
  • 문제해결능력
  • 알고리즘
  • 리트코드
  • 개발자 취업준비
  • 릿코드
  • 알고리즘문제해결
  • BFS
  • LeetCode
  • 취준
  • 개발자

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
saurus2

Saurus2

[LeetCode] 22. Generate Parentheses
컴퓨터공학/LeetCode 1000

[LeetCode] 22. Generate Parentheses

2022. 10. 26. 04:03

22. Generate Parentheses

Medium

Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses.

 

Example 1:

Input: n = 3
Output: ["((()))","(()())","(())()","()(())","()()()"]

Example 2:

Input: n = 1
Output: ["()"]

 

Constraints:

  • 1 <= n <= 8

문제 풀이

괄호들의 조합을 만들어내는 문제이다.

이 문제에서 원하는 괄호의 배치는 잘 형성되어있는 괄호이다. 

즉, 열린 괄호와 닫힌 괄호가 알맞게 조합되어있어야한다. 

예를 들어 "(())" 는 가능하지만 ")()(" 는 안된다.

백트레킹

  • 이진트리를 백트레킹하여 구현한다고 생각하자.
  • 자식은 '(' 와 ')' 두개 이기 때문에 이진트리이며, 열린 괄호와 닫힌 괄호의 갯수를 세어가며 재귀호출을 한다.
  • 그 이유는, 열린 괄호보다 닫히는 괄호가 많다면 제대로 만들어진 괄호 배열을 만들 수 없다.
  • 그래서 먼저 열린괄호가 선택되야하며 항상 닫히는 괄호가 선택될때, 열린괄호 갯수가 더 많은 상태에서 선택되어야한다.
  • 그리고 각 괄호의 갯수가 n개가 되면 정답을 리스트에 넣는다. 

소스 코드

백트레킹

Time Complexity: O(4^n / root(n))

class Solution:
    def generateParenthesis(self, n: int) -> List[str]:
        # exception
        if n == 1:
            return ["()"]
        # making parentheses set
        res = []
        def dfs(cnt1, cnt2, temp):
            if cnt1 == n and cnt2 == n:
                res.append(temp)
                return
            
            if cnt1 < n:
                dfs(cnt1 + 1, cnt2, temp + '(')
            if cnt2 < n and cnt1 > cnt2:
                dfs(cnt1, cnt2 + 1, temp + ')')
        dfs(0, 0, '')
        return res

 

 

저작자표시 (새창열림)

'컴퓨터공학 > LeetCode 1000' 카테고리의 다른 글

[LeetCode - Biweekly Contest 90] 2452. Words Within Two Edits of Dictionary  (1) 2022.11.01
[LeetCode] 49. Group Anagrams  (0) 2022.10.29
[LeetCode] 1662. Check If Two String Arrays are Equivalent  (0) 2022.10.26
[LeetCode - Online Assessment 기출] Stars and Bars* / 2055. Plates Between Candles  (0) 2022.10.21
[LeetCode - Online Assessment 기출] Circular Printer  (0) 2022.10.21
    '컴퓨터공학/LeetCode 1000' 카테고리의 다른 글
    • [LeetCode - Biweekly Contest 90] 2452. Words Within Two Edits of Dictionary
    • [LeetCode] 49. Group Anagrams
    • [LeetCode] 1662. Check If Two String Arrays are Equivalent
    • [LeetCode - Online Assessment 기출] Stars and Bars* / 2055. Plates Between Candles
    saurus2
    saurus2
    Simple is Best

    티스토리툴바