๋ฐ์ํ
๋ฌธ์ ๋ถ์
์ฒ์์ ์ฐ์ฐํ ์ซ์์ ๊ฐ์๊ฐ ์ฃผ์ด์ง๊ณ , ๋์งธ ์ค์๋ ์ฐ์ฐํ ์, ์ ์งธ ์ค์๋ ์ฐ์ฐ์์ ๊ฐ์๊ฐ ์ฃผ์ด์ง๋ค.
์๋ฅผ ๋ค์ด ์ ์ถ๋ ฅ 2๋ฅผ ๋ณด๋ฉด,
3
3 4 5
1 0 1 0
์ฐ์ฐ์๋ + , x ๊ฐ 1๊ฐ์ฉ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
๋ชจ๋ ๊ฒฝ์ฐ์ ์ฐ์ฐ์ ๋ณด๋ฉด,
3 + 4 x 5 = 35
3 x 4 + 5 = 17
๊ฒฐ๊ณผ๊ฐ 35, 17์ธ ๋๊ฐ์ง ๊ฒฝ์ฐ๊ฐ ๋์จ๋ค.
๋จผ์ ์ฌ๊ท ํจ์ ๋ถ๋ถ ์ฝ๋๋ฅผ ์ดํด๋ณด์.
static void dfs(int depth, int sum) {
/* ์ข
๋ฃ ์กฐ๊ฑด */
if (depth == N) {
if (MAX < sum) MAX = sum; // ์ if-if ๋ก ๊ตฌํ ํ๋๊ฐ?
if (MIN > sum) MIN = sum; // ๋ง์ฝ, ๊ฒฐ๊ณผ ๊ฐ์ด 2, 3, 4 ์์ผ๋ก ์จ๋ค๋ฉด if-else๋ก ๊ตฌํํ๋ค๋ฉด, MAX ๊ฐ๋ง ๋ณ๊ฒฝ ๋๋ฉด์ MIN๊ฐ์ด ์ ๋๋ก ์๋ค์ด ๊ฐ์ ๊ฒ์ด๋ค.
return;
}
for (int i = 0; i < N - 1; i++) {
int cur = numbers[depth]; // ํจ์์ ๊น์ด์ ๋ฐ๋ผ ์ซ์๋ฅผ ๋ฝ๋๋ค.
if (!isUsed[i]) { // ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ ์ ์ด ์๋์ง ํ์ธ
isUsed[i] = true; // ๋ง์ฝ ์๋ค๋ฉด, ํด๋น ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ค๊ณ ์ฒดํฌ!
int result = calc(sum, cur, operators[i]); // ๊ณ์ฐ ์์ผ๋ก ์ด๋.
dfs(depth + 1, result); // ์ฌ๊ท ํธ์ถ ๋ถ๋ถ(๊น์ด+1, ๊ณ์ฐํ ๊ฒฐ๊ณผ ๊ฐ(result)๋ฅผ ์ ๋ฌ)
isUsed[i] = false; // ์ฌ๊ท ํธ์ถ์ด ๋ชจ๋ ๋๋ฌ๋ค๊ณ ์๊ฐํ๊ณ , ๋ค์ ๋น ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ.
}
}
}
์ฌ๊ท์ ๊น์ด(depth)๋ก ์ฐ์ฐํ ์ซ์์ ๋ฐฐ์ด ์ธ๋ฑ์ค๋ก ์ฌ์ฉํ๊ณ , ์ฌ๊ท ํจ์ ์์ for๋ฌธ์ผ๋ก ์ฐ์ฐ์ ๋ฐฐ์ด์ ์ฒดํฌํ๋ฉด์, ๊ณ์ฐ์ ํด์ ๋ค์ ์ฌ๊ท ํธ์ถ์ ํ๋ฉด์ ํ๋ผ๋ฏธํฐ๋ก (๊น์ด, ์ฐ์ฐํ ๊ฒฐ๊ณผ ๊ฐ) ๋ฅผ ๋๊ฒจ์ค๋ค.
์ฐ์ฐํ๋ calc ํจ์ ๊ตฌํ
static int calc(int sum, int num, String oper) {
switch (oper) {
case "+": sum += num; break;
case "-": sum -= num; break;
case "*": sum *= num; break;
case "/": sum /= num; break;
}
return sum;
}
switch ๋ฌธ์ผ๋ก ํ๋ผ๋ฏธํฐ๋ก ๋์ด์จ ์ฐ์ฐ์(oper) ๋ฌธ์์ด์ ๋ฐ๋ผ ์ฐ์ฐ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํด ํ๋ค.
์ ์ฒด ์ฝ๋
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int MAX = Integer.MIN_VALUE; // ์ต๋๊ฐ
static int MIN = Integer.MAX_VALUE; // ์ต์๊ฐ
static String[] operators; // ์ฐ์ฐ์ ๋ฐฐ์ด
static boolean[] isUsed; // ์ฐ์ฐ์ ์ฌ์ฉ ์ฌ๋ถ ์ฒดํฌ
static int[] numbers; // ๊ณ์ฐํ ์ซ์ ๋ฐฐ์ด
static int N; // ์ซ์ ๊ฐ์
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
N = Integer.parseInt(bf.readLine());
numbers = new int[N];
operators = new String[N-1];
isUsed = new boolean[N];
/* numbers ๋ฐ๊ธฐ */
st = new StringTokenizer(bf.readLine());
for (int i = 0; i < N; i++) {
numbers[i] = Integer.parseInt(st.nextToken());
}
/* operators ๋ฐ๊ธฐ */
int index = 0;
String oper = "+-*/";
st = new StringTokenizer(bf.readLine());
for (int i = 0; i < 4; i++) {
int n = Integer.parseInt(st.nextToken());
if (n > 0) {
String op = oper.substring(i, i + 1);
while (n-- > 0) {
operators[index++] = op;
}
}
}
dfs(1, numbers[0]);
System.out.println(MAX);
System.out.println(MIN);
}
static void dfs(int depth, int sum) {
/* ์ข
๋ฃ ์กฐ๊ฑด */
if (depth == N) {
if (MAX < sum) MAX = sum;
if (MIN > sum) MIN = sum;
return;
}
for (int i = 0; i < N - 1; i++) {
int cur = numbers[depth];
if (!isUsed[i]) {
isUsed[i] = true;
int result = calc(sum, cur, operators[i]);
dfs(depth + 1, result);
isUsed[i] = false;
}
}
}
static int calc(int sum, int num, String oper) {
switch (oper) {
case "+": sum += num; break;
case "-": sum -= num; break;
case "*": sum *= num; break;
case "/": sum /= num; break;
}
return sum;
}
}
๋ฐ์ํ