주녘공부일지

[프로그래머스 C#] Lv.4 올바른 괄호의 갯수 본문

Programmers - C#/CodingTest Lv.4

[프로그래머스 C#] Lv.4 올바른 괄호의 갯수

주녘 2023. 10. 18. 16:15
728x90

https://school.programmers.co.kr/learn/courses/30/lessons/12929

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

1. 정답코드 및 핵심 아이디어, 유의사항

어느 한 괄호 안에 n개의 괄호쌍이 들어간다면, n개의 괄호쌍으로 만들 수 있는 모든 괄호 문자열이 들어갈 수 있으므로, DP문제라고 유추할 수 있음 -> 점화식 구하는 문제

https://godgjwnsgur7.tistory.com/109

 

[Algorithm C#] 동적 계획법(DP) / Memoization, Tabulation

1. 동적 계획법(DP : Dynamic Programming) 복잡한 하나의 큰 문제를 여러 개의 작은 문제로 나누어 해결하는 문제해결 방법 중 하나 - 작은 문제의 연산 결과를 저장해놓았다가 다시 큰 문제를 해결할

godgjwnsgur7.tistory.com

DP[1] = 1쌍의 괄호의 경우는 1가지 ()

DP[2] = 2쌍의 괄호의 경우는 2가지 ()(), (())

DP[3] = 3쌍의 괄호의 경우는 5가지 (중요)

- 안에 2개의 괄호, 밖에 0개의 괄호 ((())), (()()) = DP[2] * DP[0]

- 안에 1개의 괄호, 밖에 1개의 괄호 (())()          = DP[1] * DP[1]

- 안에 0개의 괄호, 밖에 2개의 괄호 ()(()), ()()() = DP[0] * DP[2]

( 곱셈 연산이 들어가기 때문에 DP[0]은 1로 계산 )

 

DP[n] = DP[0]*DP[n-1] + DP[1]*DP[n-2] +ㆍ+ DP[n-1]*DP[0] ( DP[0] = 1 )

ex) DP[4] = DP[3]*DP[0] + DP[2]*DP[1] + DP[1]*DP[2] + DP[0]*DP[3] = 5 + 2 + 2 + 5 = 14

 

이는, 카탈란 수인데, 이와 관련된 더 자세한 내용은 하단 블로그 링크 참조

https://plusthemath.tistory.com/445

 

[더플러스수학] 카탈란 수 - 점화식(3)

카탈란 수란 무엇인가?에 대한 글 2021.08.02 - [수학과 공부이야기] - [더플러스수학] 카탈란 수 (1) [더플러스수학] 카탈란 수 (1) 이산수학 최경식(경문사)에서의 예에서 시작해보자. 요금이 \(\display

plusthemath.tistory.com

정답 풀이 코드

    public class Solution
    {
        public int solution(int n)
        {
            int[] dp = new int[n + 1];
            dp[0] = 1;
            dp[1] = 1;

            for (int i = 2; i <= n; i++)
            {
                int num = i - 1;

                for (int j = 0; j < i; j++)
                    dp[i] += dp[j] * dp[num - j];
            }
            
            return dp[n];
        }
    }

 

728x90