Algorithm/BOJ

KOI 2019 고등부 2차 / 괄호 - 17623

jhg0406 2020. 7. 31. 14:26
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <iostream>
using namespace std;
 
string dp[1001];
 
string min(string s1, string s2) {
    if(s1.size() == 0return s2;
    if(s1.size() == s2.size()) {
        for(int i = 0; i<s1.size(); ++i)
            if(s1[i] < s2[i]) return s1;
            else if(s1[i] > s2[i]) return s2;
    }
    else if(s1.size() < s2.size()) return s1;
    return s2;
}
 
void convert(string& s) {
    for(int i = 0; i<s.size(); ++i) {
        switch(s[i]) {
            case '1'cout << "(";
            break;
            case '2'cout << ")";
            break;
            case '3'cout << "{";
            break;
            case '4'cout << "}";
            break;
            case '5'cout << "[";
            break;
            case '6'cout << "]";
        }
    }
    cout << "\n";
}
 
int main() {
    ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int C;
    cin >> C;
    dp[1= "12";
    dp[2= "34";
    dp[3= "56";
    for(int i = 4; i<=1000++i) {
        for(int j = 1; j<i; ++j)
            dp[i] = min(dp[i], dp[j]+dp[i-j]);
 
        if(i % 2 == 0) dp[i] = min(dp[i], "1" + dp[i/2+ "2");
        if(i % 3 == 0) dp[i] = min(dp[i], "3" + dp[i/3+ "4");
        if(i % 5 == 0) dp[i] = min(dp[i], "5" + dp[i/5+ "6");
    }
    int N;
    for(int tn = 0; tn<C; ++tn) {
        cin >> N;
        convert(dp[N]);
    }
}
cs

 

 

 

 

 

 

https://www.acmicpc.net/problem/17623

 

17623번: 괄호

6개의 문자 ‘(’, ‘)’, ‘{’, ‘}’, ‘[’, ‘]’ 로 이루어진 올바른 괄호 문자열 W에 대하여 정수의 ‘괄호값’을 지정하는 함수 val(W)가 정의되어 있다. 먼저 올바른 괄호 문자열부터 정의해

www.acmicpc.net

 

 

 

 

 

 

괄호

DP로 해결 할 수 있습니다.

dp[i]를 i를 만들수 있는 괄호의 조합중 dmap이 가장 작은것 이라고 한다면

i = a + b(a, b는 자연수)로 표현할 수 있고

따라서 dp[i] 는 dp[a] + dp[b]가 최소가 되는 a와 b의 조합을 찾으면 됩니다.

추가로, 전체를 감싸는 경우도 생각해 주어 i가 2, 3, 5로 나누어 떨어질 경우도 고려해주면 됩니다.

 

 

오답노트)

처음엔 i = a+b를 생각하지 못하고 덧셈에 대해서 i-1, i-2, i-3 인 경우만 고려해서 틀린 답을 구했습니다.