π‘ Info
λ΄μ©
Nκ°μ μλ‘ μ΄λ£¨μ΄μ§ μμ΄ A1, A2, ..., ANμ΄ μ£Όμ΄μ§λ€. λ, μμ μ μ¬μ΄μ λΌμλ£μ μ μλ N-1κ°μ μ°μ°μκ° μ£Όμ΄μ§λ€. μ°μ°μλ λ§μ (+), λΊμ (-), κ³±μ (Γ), λλμ (Γ·)μΌλ‘λ§ μ΄λ£¨μ΄μ Έ μλ€.
μ°λ¦¬λ μμ μ μ¬μ΄μ μ°μ°μλ₯Ό νλμ© λ£μ΄μ, μμμ νλ λ§λ€ μ μλ€. μ΄λ, μ£Όμ΄μ§ μμ μμλ₯Ό λ°κΎΈλ©΄ μ λλ€.
μλ₯Ό λ€μ΄, 6κ°μ μλ‘ μ΄λ£¨μ΄μ§ μμ΄μ΄ 1, 2, 3, 4, 5, 6μ΄κ³ , μ£Όμ΄μ§ μ°μ°μκ° λ§μ (+) 2κ°, λΊμ (-) 1κ°, κ³±μ (Γ) 1κ°, λλμ (Γ·) 1κ°μΈ κ²½μ°μλ μ΄ 60κ°μ§μ μμ λ§λ€ μ μλ€. μλ₯Ό λ€μ΄, μλμ κ°μ μμ λ§λ€ μ μλ€.
μμ κ³μ°μ μ°μ°μ μ°μ μμλ₯Ό 무μνκ³ μμμλΆν° μ§νν΄μΌ νλ€. λ, λλμ μ μ μ λλμ μΌλ‘ λͺ«λ§ μ·¨νλ€. μμλ₯Ό μμλ‘ λλ λλ C++14μ κΈ°μ€μ λ°λ₯Έλ€. μ¦, μμλ‘ λ°κΎΌ λ€ λͺ«μ μ·¨νκ³ , κ·Έ λͺ«μ μμλ‘ λ°κΎΌ κ²κ³Ό κ°λ€. μ΄μ λ°λΌμ, μμ μ 4κ°μ κ²°κ³Όλ₯Ό κ³μ°ν΄λ³΄λ©΄ μλμ κ°λ€.
Nκ°μ μμ N-1κ°μ μ°μ°μκ° μ£Όμ΄μ‘μ λ, λ§λ€ μ μλ μμ κ²°κ³Όκ° μ΅λμΈ κ²κ³Ό μ΅μμΈ κ²μ ꡬνλ νλ‘κ·Έλ¨μ μμ±νμμ€.
π₯μ λ ₯ 쑰건
π€μΆλ ₯ 쑰건
μ μΆλ ₯ μμ
2
5 6
0 0 1 0
30
30
3
3 4 5
1 0 1 0
35
17
6
1 2 3 4 5 6
2 1 1 1
54
-24
μ€μ νμ΄ μκ° : 30λΆ
import java.util.*;
public class BJ14888 {
static int N;
static int[] num;
static int[] oper;
static int maxResult = Integer.MAX_VALUE;
static int minResult = Integer.MIN_VALUE;
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
N = sc.nextInt();
int[] num = new int[N];
for(int i=0; i<N; i++){
num[i] = sc.nextInt();
}
oper = new int[4];
for(int i=0; i<4; i++){
oper[i] = sc.nextInt();
}
int result = 0;
for(int i=0; i<4; i++){
int index = 0;
if(oper[i] > 0) {
switch (i) {
case 0:
Math.max(num[index] / num[index], index / 1);
break;
case 1:
Math.max(num[index] + num[index], index - 1);
break;
case 2:
Math.max(num[index] - num[index], index - 1);
break;
case 3:
Math.max(num[index] * num[index], index * 1);
break;
}
maxResult = Math.max(maxResult, result);
minResult = Math.min(minResult, result);
}
}
System.out.println(maxResult);
System.out.println(minResult);
}
}
DFS μ μΈνκ³ μ‘°κ±΄μ μΆκ°ν΄ ν΄κ²°
//before
int result = 0;
for(int i=0; i<4; i++){
int index = 0;
if(oper[i] > 0) {
switch (i) {
case 0:
Math.max(num[index] / num[index], index / 1);
break;
case 1:
Math.max(num[index] + num[index], index - 1);
break;
case 2:
Math.max(num[index] - num[index], index - 1);
break;
case 3:
Math.max(num[index] * num[index], index * 1);
break;
}
maxResult = Math.max(maxResult, result);
minResult = Math.min(minResult, result);
}
}
System.out.println(maxResult);
System.out.println(minResult);
Switch-caseλ¬Έμ μ°μ°μ κ³μ° μΌμ΄μ€λ₯Ό μμλ₯Ό μΌλ°μ μΈ +, -, /, * μμΌλ‘ λ€μ μ¬κ΅¬μ±
μ°μ° λ€μμλ λ€μ μ«μλ‘ λμ΄κ°λλ‘ κ΅¬μ±ν΄μ ν΄κ²°
//ing
...
static int maxResult = Integer.MIN_VALUE; // μ΄κΈ° μ΅λκ°μ κ°μ₯ μμ κ°μΌλ‘ μ€μ
static int minResult = Integer.MAX_VALUE; // μ΄κΈ° μ΅μκ°μ κ°μ₯ ν° κ°μΌλ‘ μ€μ
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
...
dfs(num[0], 1); // μ΄κΈ° κ°μ μμ΄μ 첫 λ²μ§Έ μ«μλΆν° μμ
System.out.println(maxResult);
System.out.println(minResult);
}
...
switch (i) {
case 0:
//dfs λ·λΆλΆ λ³μλ₯Ό λͺ¨λ λ€μ μλ₯Ό μλ―Ένλ index+1λ‘ λ³κ²½νκΈ°!
dfs(num[index] / num[index], index + 1);
break;
case 1:
dfs(num[index] + num[index], index + 1);
break;
case 2:
dfs(num[index] - num[index], index + 1);
break;
case 3:
dfs(num[index] * num[index], index + 1);
break;
}
//μ¬κ·νΈμΆ μ’
λ£ ν μ°μ°μ κ°μ 볡ꡬνκΈ°
oper[i]++;
}
}
}
}
//after
for (int i = 0; i < 4; i++) {
if (oper[i] > 0) {
oper[i]--;
int nextNum = 0;
switch (i) {
case 0:
nextNum = oneNum + num[index];
break;
case 1:
nextNum = oneNum - num[index];
break;
case 2:
nextNum = oneNum * num[index];
break;
case 3:
nextNum = oneNum / num[index];
break;
}
dfs(nextNum, index + 1);
oper[i]++; // μ¬κ· νΈμΆμ΄ λλ ν μ°μ°μ κ°μ 볡ꡬ
}
}
}
μ€μ νμ΄ μκ° : 51λΆ(첫 νμ΄ ν¬ν¨)
import java.util.*;
public class Main {
static int N;
static int[] num;
static int[] oper;
static int maxResult = Integer.MIN_VALUE; // μ΄κΈ° μ΅λκ°μ κ°μ₯ μμ κ°μΌλ‘ μ€μ
static int minResult = Integer.MAX_VALUE; // μ΄κΈ° μ΅μκ°μ κ°μ₯ ν° κ°μΌλ‘ μ€μ
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
N = sc.nextInt();
num = new int[N];
for(int i=0; i<N; i++){
num[i] = sc.nextInt();
}
oper = new int[4];
for(int i=0; i<4; i++){
oper[i] = sc.nextInt();
}
dfs(num[0], 1); // μ΄κΈ° κ°μ μμ΄μ 첫 λ²μ§Έ μ«μλΆν° μμ
System.out.println(maxResult);
System.out.println(minResult);
}
public static void dfs(int oneNum, int index){
if(index == N) { // λͺ¨λ μ«μλ₯Ό λ€ μ¬μ©ν κ²½μ°
maxResult = Math.max(maxResult, oneNum);
minResult = Math.min(minResult, oneNum);
return;
}
for (int i = 0; i < 4; i++) {
if (oper[i] > 0) {
oper[i]--;
int nextNum = 0;
switch (i) {
case 0:
nextNum = oneNum + num[index];
break;
case 1:
nextNum = oneNum - num[index];
break;
case 2:
nextNum = oneNum * num[index];
break;
case 3:
nextNum = oneNum / num[index];
break;
}
dfs(nextNum, index + 1);
oper[i]++; // μ¬κ· νΈμΆμ΄ λλ ν μ°μ°μ κ°μ 볡ꡬ
}
}
}
}