문제 링크입니다 https://www.acmicpc.net/problem/14888
14888번: 연산자 끼워넣기
첫째 줄에 수의 개수 N(2 ≤ N ≤ 11)가 주어진다. 둘째 줄에는 A1, A2, ..., AN이 주어진다. (1 ≤ Ai ≤ 100) 셋째 줄에는 합이 N-1인 4개의 정수가 주어지는데, 차례대로 덧셈(+)의 개수, 뺄셈(-)의 개수, 곱셈(×)의 개수, 나눗셈(÷)의 개수이다.
www.acmicpc.net
입력으로 주어지는 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
|
// [백준] 삼성 SW 역량 테스트 기출 문제 : 연산자 끼워넣기(14888)
#include<cstdio>
int n, c, num[11], cal[4], result[11], ret_max, ret_min;
// result 배열에 0번 인덱스부터 n - 2번 인덱스까지 n - 1개의 연산자를
// 주어진 연산자들 중 골라서 채운 후 연산하여 최대, 최솟값을 구해주는 함수
void getResult(int count) {
if (count == n - 1) {
int sum = num[0]; // 초기값 첫 번째 숫자
for (int i = 0; i < n - 1; i++) {
if (result[i] == 0) sum += num[i + 1]; // 0번 연산자 : +
else if (result[i] == 1) sum -= num[i + 1]; // 1번 연산자 : -
else if (result[i] == 2) sum *= num[i + 1]; // 2번 연산자 : *
else if (result[i] == 3) sum /= num[i + 1]; // 3번 연산자 : /
}
if (ret_max < sum) ret_max = sum;
if (ret_min > sum) ret_min = sum;
}
else {
for (int i = 0; i < 4; i++) {
if (cal[i] > 0) {
cal[i]--; // 고른 연산자의 개수를 줄여줌
result[count] = i;
getResult(count + 1);
cal[i]++; // 다시 늘려줘야 순서를 바꿔가며 고를 수 있음
}
}
}
}
int main(void) {
scanf("%d", &n);
for (int i = 0; i < n; i++) scanf("%d", &num[i]);
for (int i = 0; i < 4; i++) scanf("%d", &cal[i]); // i번 연산자가 cal[i]개가 있다
ret_max = -1000000001; // -10억이 최댓값이 될 수 있으므로
ret_min = 1000000001; // 10억이 최솟값이 될 수 있으므로
getResult(0);
printf("%d\n%d\n", ret_max, ret_min);
return 0;
}
|
cs |
'알고리즘 > BaekJoon' 카테고리의 다른 글
백준 13460 : 구슬 탈출 2 (0) | 2020.02.21 |
---|---|
백준 3190 : 뱀 (0) | 2020.02.20 |
백준 14501 : 퇴사 (0) | 2020.02.20 |
백준 11403 : 경로 찾기 (0) | 2020.02.19 |
백준 1260 : DFS와 BFS (0) | 2020.02.19 |