Skip to content

Commit 147d5ea

Browse files
committed
[Silver I] Title: 연산자 끼워넣기, Time: 112 ms, Memory: 15816 KB -BaekjoonHub
1 parent 5dc243a commit 147d5ea

File tree

2 files changed

+119
-0
lines changed

2 files changed

+119
-0
lines changed
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
# [Silver I] 연산자 끼워넣기 - 14888
2+
3+
[문제 링크](https://www.acmicpc.net/problem/14888)
4+
5+
### 성능 요약
6+
7+
메모리: 15816 KB, 시간: 112 ms
8+
9+
### 분류
10+
11+
브루트포스 알고리즘, 백트래킹
12+
13+
### 제출 일자
14+
15+
2026년 3월 24일 10:44:40
16+
17+
### 문제 설명
18+
19+
<p>N개의 수로 이루어진 수열 A<sub>1</sub>, A<sub>2</sub>, ..., A<sub>N</sub>이 주어진다. 또, 수와 수 사이에 끼워넣을 수 있는 N-1개의 연산자가 주어진다. 연산자는 덧셈(+), 뺄셈(-), 곱셈(×), 나눗셈(÷)으로만 이루어져 있다.</p>
20+
21+
<p>우리는 수와 수 사이에 연산자를 하나씩 넣어서, 수식을 하나 만들 수 있다. 이때, 주어진 수의 순서를 바꾸면 안 된다.</p>
22+
23+
<p>예를 들어, 6개의 수로 이루어진 수열이 1, 2, 3, 4, 5, 6이고, 주어진 연산자가 덧셈(+) 2개, 뺄셈(-) 1개, 곱셈(×) 1개, 나눗셈(÷) 1개인 경우에는 총 60가지의 식을 만들 수 있다. 예를 들어, 아래와 같은 식을 만들 수 있다.</p>
24+
25+
<ul>
26+
<li>1+2+3-4×5÷6</li>
27+
<li>1÷2+3+4-5×6</li>
28+
<li>1+2÷3×4-5+6</li>
29+
<li>1÷2×3-4+5+6</li>
30+
</ul>
31+
32+
<p>식의 계산은 연산자 우선 순위를 무시하고 앞에서부터 진행해야 한다. 또, 나눗셈은 정수 나눗셈으로 몫만 취한다. 음수를 양수로 나눌 때는 C++14의 기준을 따른다. 즉, 양수로 바꾼 뒤 몫을 취하고, 그 몫을 음수로 바꾼 것과 같다. 이에 따라서, 위의 식 4개의 결과를 계산해보면 아래와 같다.</p>
33+
34+
<ul>
35+
<li>1+2+3-4×5÷6 = 1</li>
36+
<li>1÷2+3+4-5×6 = 12</li>
37+
<li>1+2÷3×4-5+6 = 5</li>
38+
<li>1÷2×3-4+5+6 = 7</li>
39+
</ul>
40+
41+
<p>N개의 수와 N-1개의 연산자가 주어졌을 때, 만들 수 있는 식의 결과가 최대인 것과 최소인 것을 구하는 프로그램을 작성하시오.</p>
42+
43+
### 입력
44+
45+
<p>첫째 줄에 수의 개수 N(2 ≤ N ≤ 11)가 주어진다. 둘째 줄에는 A<sub>1</sub>, A<sub>2</sub>, ..., A<sub>N</sub>이 주어진다. (1 ≤ A<sub>i</sub> ≤ 100) 셋째 줄에는 합이 N-1인 4개의 정수가 주어지는데, 차례대로 덧셈(+)의 개수, 뺄셈(-)의 개수, 곱셈(×)의 개수, 나눗셈(÷)의 개수이다. </p>
46+
47+
### 출력
48+
49+
<p>첫째 줄에 만들 수 있는 식의 결과의 최댓값을, 둘째 줄에는 최솟값을 출력한다. 연산자를 어떻게 끼워넣어도 항상 -10억보다 크거나 같고, 10억보다 작거나 같은 결과가 나오는 입력만 주어진다. 또한, 앞에서부터 계산했을 때, 중간에 계산되는 식의 결과도 항상 -10억보다 크거나 같고, 10억보다 작거나 같다.</p>
50+
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
import java.io.BufferedReader;
2+
import java.io.IOException;
3+
import java.io.InputStreamReader;
4+
import java.util.ArrayList;
5+
import java.util.StringTokenizer;
6+
7+
// 6
8+
// 1 2 3 4 5 6
9+
// 2 1 1 1
10+
11+
public class Main {
12+
13+
static int N;
14+
static int max = Integer.MIN_VALUE;
15+
static int min = Integer.MAX_VALUE;
16+
static int[] numbers;
17+
static int[] operators;
18+
19+
public static void main(String[] args) throws IOException {
20+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
21+
N = Integer.parseInt(br.readLine());
22+
StringTokenizer numbersInput = new StringTokenizer(br.readLine());
23+
StringTokenizer operatorsInput = new StringTokenizer(br.readLine());
24+
25+
numbers = new int[N];
26+
operators = new int[4];
27+
28+
// 숫자 배열 초기화
29+
for(int i = 0; numbersInput.hasMoreTokens(); i++) {
30+
numbers[i] = Integer.parseInt(numbersInput.nextToken());
31+
}
32+
33+
// 연산자 배열 초기화
34+
for(int i = 0; operatorsInput.hasMoreTokens(); i++) {
35+
operators[i] = Integer.parseInt(operatorsInput.nextToken());
36+
}
37+
38+
dfs(1, numbers[0]);
39+
System.out.println(max);
40+
System.out.println(min);
41+
}
42+
43+
private static void dfs(int depth, int number) {
44+
if (depth == N) {
45+
max = Math.max(number, max);
46+
min = Math.min(number, min);
47+
return;
48+
}
49+
50+
for (int i = 0; i < 4; i++) {
51+
if (operators[i] > 0) {
52+
operators[i] = operators[i] - 1;
53+
54+
if (i == 0) {
55+
dfs(depth + 1, number + numbers[depth]);
56+
} else if (i == 1) {
57+
dfs(depth + 1, number - numbers[depth]);
58+
} else if (i == 2) {
59+
dfs(depth + 1, number * numbers[depth]);
60+
} else if (i == 3) {
61+
dfs(depth + 1, number / numbers[depth]);
62+
}
63+
64+
// 백트래킹
65+
operators[i] = operators[i] + 1;
66+
}
67+
}
68+
}
69+
}

0 commit comments

Comments
 (0)