Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
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
Archives
Today
Total
관리 메뉴

최's 먹공로그

BOJ14888_연산자끼워넣기 본문

APS

BOJ14888_연산자끼워넣기

ChoiSH313 2019. 7. 10. 21:51

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


문제정리

1. N개의 수로 이루어진 수열

2. N-1개의 연산자가 주어지며 연산자는 + - * /

3. 주어진 수의 순서를 바구면 안된다

4. 식의 계산은 무조건 앞에서부터 진행

5. 나눗셈은 정수 나눗셈으로 몫만 취한다

6. 음수를 양수로 나눌 때는 C++14의 기준을 따른다

즉, 양수로 바꾼뒤(음수를) 몫을 취하고 그 몫을 음수로 바꾼다

7. N개의 수와 N-1개의 연산자가 주어졌을 때, 만들 수 있는 식의 결과가 최대인 것과

최소인 것을 구하는 프로그램을 작성

8. +의 개수 , -의 개수 , *의 개수 , /의 개수


문제issue

1. / 할 때 조건 생각

2. 같은 연산자 있을 때 순열의 개수를 줄일 수 있는 방법?


해결흐름

1. 숫자는 그냥 배열에 넣고 쓴다

2. 연산자도 전체 개수 크기만큼의 배열 생성해서 각각의 개수 만큼 배열에 넣는다

3. 연산자 배열로 순열을 돌린다

4. 순열 한개 마다 바로바로 계산


소스코드

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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
 
public class Main {
 
    private static int[] number_arr;
    private static boolean[] oper_visited;
    private static char[] oper_arr;
    private static int N;
    private static char[] perm_arr;
    private static int max_result;
    private static int min_result;
    private static int[] arr_clone;
 
    public static void main(String[] args) throws Exception {
        // input
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        N = Integer.parseInt(br.readLine().trim());
        number_arr = new int[N];
        arr_clone = new int[N];
        oper_visited = new boolean[N - 1];
        oper_arr = new char[N - 1];
        perm_arr = new char[N - 1];
        max_result = Integer.MIN_VALUE;
        min_result = Integer.MAX_VALUE;
        int[] oper_check = new int[4];
        List<Character> list = new ArrayList<>();
        StringTokenizer st = new StringTokenizer(br.readLine().trim(), " ");
        for (int i = 0; i < N; i++) {
            number_arr[i] = Integer.parseInt(st.nextToken());
        }
        st = new StringTokenizer(br.readLine().trim(), " ");
        for (int i = 0; i < 4; i++) {
            oper_check[i] = Integer.parseInt(st.nextToken());
        }
        for (int i = 0; i < 4; i++) {
            if (i == 0) {
                for (int j = 0; j < oper_check[i]; j++) {
                    list.add('+');
                }
            } else if (i == 1) {
                for (int j = 0; j < oper_check[i]; j++) {
                    list.add('-');
                }
            } else if (i == 2) {
                for (int j = 0; j < oper_check[i]; j++) {
                    list.add('*');
                }
            } else if (i == 3) {
                for (int j = 0; j < oper_check[i]; j++) {
                    list.add('/');
                }
            }
        }
        for (int i = 0; i < list.size(); i++) {
            oper_arr[i] = list.get(i);
        }
        // start
        nPm(0);
        System.out.println(max_result);
        System.out.println(min_result);
 
    } // end of main
 
    private static void nPm(int len) {
        if (len == N - 1) {
            // perm_arr을 이용 최솟값 , 최댓값 갱신
            for (int i = 0; i < N; i++) {
                arr_clone[i] = number_arr[i];
            }
//            System.out.println("=================");
            solve();
            return;
        }
        for (int i = 0; i < N - 1; i++) {
            if (!oper_visited[i]) {
                oper_visited[i] = true;
                perm_arr[i] = oper_arr[len];
                nPm(len + 1);
                oper_visited[i] = false;
            }
        }
    }
 
    private static void solve() {
        int number_idx = 0;
        int oper_idx = 0;
        while (true) {
//            System.out.println(Arrays.toString(arr_clone));
            if (number_idx == N - 1)
                break;
            char oper = perm_arr[oper_idx++];
            if (oper == '+') {
                int a = arr_clone[number_idx];
                int b = arr_clone[++number_idx];
                arr_clone[number_idx] = a + b;
            } else if (oper == '-') {
                int a = arr_clone[number_idx];
                int b = arr_clone[++number_idx];
                arr_clone[number_idx] = a - b;
            } else if (oper == '*') {
                int a = arr_clone[number_idx];
                int b = arr_clone[++number_idx];
                arr_clone[number_idx] = a * b;
            } else if (oper == '/') {
                int a = arr_clone[number_idx];
                int b = arr_clone[++number_idx];
                if (b != 0) {
                    if (a < 0) {
                        a = a * -1;
                        int number = a / b;
                        number = number * -1;
                        arr_clone[number_idx] = number;
                    } else if (a >= 0) {
                        arr_clone[number_idx] = a / b;
                    }
                } else if (b == 0) {
                    arr_clone[number_idx] = a;
                }
            }
        }
        if (max_result < arr_clone[number_idx])
            max_result = arr_clone[number_idx];
        if (min_result > arr_clone[number_idx])
            min_result = arr_clone[number_idx];
    }
// end of class
cs


'APS' 카테고리의 다른 글

SEA5656_벽돌깨기  (0) 2019.07.18
SEA5658_보물상자 비밀번호  (2) 2019.07.15
BOJ14889_스타트와 링크  (0) 2019.07.06
BOJ15683_감시  (4) 2019.06.29
BOJ14500_테트로미노  (2) 2019.06.26