백준 16637 괄호 추가하기
본문 바로가기
알고리즘 모음집/알고리즘 (Algorithm)

백준 16637 괄호 추가하기

by KyeongMin 2019. 9. 22.
728x90
반응형

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

 

16637번: 괄호 추가하기

첫째 줄에 수식의 길이 N(1 ≤ N ≤ 19)가 주어진다. 둘째 줄에는 수식이 주어진다. 수식에 포함된 정수는 모두 0보다 크거나 같고, 9보다 작거나 같다. 문자열은 정수로 시작하고, 연산자와 정수가 번갈아가면서 나온다. 연산자는 +, -, * 중 하나이다. 여기서 *는 곱하기 연산을 나타내는 × 연산이다. 항상 올바른 수식만 주어지기 때문에, N은 홀수이다.

www.acmicpc.net

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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include<stdio.h>
#include<vector>
#include<string>
#include<algorithm>
#include<string.h>
#define NSIZE 19
using namespace std;
char input[NSIZE];
int chk[NSIZE];
int N;
int Max = 0x80000000;
int sum(int idx) {
    int num = 0;
    if (input[idx] == '*') {
        num = (input[idx - 1- '0'* (input[idx + 1- '0');
    }
    if (input[idx] == '-') {
        num = (input[idx - 1- '0'- (input[idx + 1- '0');
    }
    if (input[idx] == '+') {
        num = (input[idx - 1- '0'+ (input[idx + 1- '0');
    }
    return num;
}
void dfs(int idx,int answer) {
    if (idx>=N) {
        Max = Max < answer ? answer : Max;
        return;
    }
    int num = 0;
    //괄호 안하고
    if (input[idx] == '+') {
        num = answer + (input[idx+1- '0');
    }
    else if (input[idx] == '-') {
    num = answer - (input[idx+1- '0');
 
    }
    else if (input[idx] == '*') {
    num = answer * (input[idx+1- '0');
 
    }
    dfs(idx+2, num);
 
    if (idx+2 < N) {
        //괄호 하고 
        if (input[idx] == '+') {
                num = answer + sum(idx+2);
        }
        else if (input[idx] == '-') {
                num = answer - sum(idx +2);
        }
        else if (input[idx] == '*') {
                num = answer * sum(idx + 2);
        }
        dfs(idx + 4, num);
    }
}
void init() {
    scanf("%d"&N);
    scanf("%s", input);
}
int main(void) {
    init();
    if (N == 1) {
        printf("%c", input[0]);
        return 0;
    }
    dfs(1,input[0]-'0');
    printf("%d", Max);
 
}
 
 

이번문제는 쉽긴했는데 생각하는 과정이 조금 어려웠네요. 

지금까지 풀었던 문제와는 조금 다르게 인덱스를 0 부터 시작이아니고 1부터 시작하고 , 값을 처음 넘긴다음에 

구현해야합니다. 

그래야 8 * 9 + 0  이 입력이라면 

우선 * 를 기준으로 그 뒤에 오는 숫자만 잘 계산해주면 간단해 지기 때문이죠.

물론 경우를 뽑고 계산을 해도되지만 솔직히 이런문제는 계산을 미리 할수 있으면 계산을 하고 넘기는게 

어쩔때는 4배이상 빠른것같아요.

대신 여기서 포인트는

 

이렇게 나눠서 구현만 잘해주면 재귀는 알아서 해줍니다. 약간 네비찍으면 알아서가는 자동차 같은 느낌 아닌가 하네요.

재귀는 이럴때 정말 편해요.

다들 익숙해져봐요.

오늘은 여기까지이고 의문이있는점은 댓글 달아주세요. 

 

 

728x90
반응형

'알고리즘 모음집 > 알고리즘 (Algorithm)' 카테고리의 다른 글

백준 1194 달이 차오른다, 가자.  (0) 2019.09.25
백준 1600 말이 되고픈 원숭이  (0) 2019.09.23
백준 16509 장군  (0) 2019.09.21
백준 9328 열쇠  (0) 2019.09.19
백준 6087 레이저 통신  (0) 2019.09.19

댓글