https://school.programmers.co.kr/learn/courses/30/lessons/12929
문제는 매우간단
실제로 나오는 코드도 매우 간단하게 나오긴한다.
근데 문제 -> 코드로 가는 그 사고력.. 그게 어려우니 레벨 4였던것같다.
괄호.. 2쌍이 생겨나는 경우를 한번 살펴보자.
괄호 2쌍은 ()() , (()) 2개의 경우다.
(())은 이전 괄호 1쌍에있던 모든 경우를 마치 감싸듯이 나오는 형태고,
()() 는 괄호 1쌍을 2개 붙인경우다. EX) f(1)*f(1)
괄호 3쌍을 살펴보자.
(()()) , ((())) 형태가 있다.
이 형태역시 이전 괄호 2쌍에있던 모든 경우를 마치 감싸듯이 나온 형태다.
그리고 (())(), ()(()), ()()() 형태가 있다.
이 형태는, f(2)의 덩어리와 f(1)을곱, f(1)의 덩어리와 f(2)의 곱이다.
즉 5개가 존재한다.
덩어리= () 형태로 전체가 감싼 경우다.
즉, 2개의 DP를 생성한다.
dp1은 총합의 dp고,
dp2는 덩어리의 dp이다. () 형태로 전체 감싼것만 센 갯수
dp2[n] = dp[n] 과 동일하다. 이전의 괄호쌍에 ()로 덮으면 같은 갯수가 나오기때문이다.
dp[n] = dp[n-1]*dp2[1] + dp[n-2]*dp2[2] + ... dp[1]*dp[n-1] 이 성립한다.
즉, A의 형태와 B덩어리의 형태의 조합의 모든 덧셈이다.
이걸 코드로나타내면
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
|
class Solution {
public int solution(int n) {
int answer = 0;
//총합 dp
int[] dp = new int[n+1];
//덩어리 dp
int[] dp2 = new int[n+1];
dp[1]=1;
dp2[1]=1;
for(int i=2;i<=n;i++){
dp2[i]=dp[i-1];
int sum =0;
for(int j=1;j<=i;j++){
sum+=dp[j]*dp2[i-j];
}
dp[i]=sum+dp2[i];
}
//f(3)= f(2),f(1)
return dp[n];
}
}
|
cs |
다른 사람의 풀이:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
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++) {
for(int j = 0; j < i; j++) {
dp[i] += dp[i - j - 1] * dp[j];
}
}
return dp[n];
}
}
|
cs |
맥락은 비슷하다. 하지만, 이 코드같은경우, 필자와같이 dp 2개를쓰는걸 최적화시켜서
하나로 표현한것이다.
'알고리즘 > 프로그래머스 Level4' 카테고리의 다른 글
[프로그래머스,Java] Level4 : 쌍둥이 빌딩 숲 (0) | 2023.04.20 |
---|---|
[프로그래머스,Java] Level4: 무지의 먹방 라이브 (0) | 2023.04.03 |
[프로그래머스,Java] Level4: 행렬과 연산 (2) | 2022.08.24 |