๐ ๋ฌธ์
https://www.acmicpc.net/problem/14888
๋ฌธ์
N๊ฐ์ ์๋ก ์ด๋ฃจ์ด์ง ์์ด A1, A2, ..., AN์ด ์ฃผ์ด์ง๋ค. ๋, ์์ ์ ์ฌ์ด์ ๋ผ์๋ฃ์ ์ ์๋ N-1๊ฐ์ ์ฐ์ฐ์๊ฐ ์ฃผ์ด์ง๋ค. ์ฐ์ฐ์๋ ๋ง์ (+), ๋บ์ (-), ๊ณฑ์ (×), ๋๋์ (÷)์ผ๋ก๋ง ์ด๋ฃจ์ด์ ธ ์๋ค.
์ฐ๋ฆฌ๋ ์์ ์ ์ฌ์ด์ ์ฐ์ฐ์๋ฅผ ํ๋์ฉ ๋ฃ์ด์, ์์์ ํ๋ ๋ง๋ค ์ ์๋ค. ์ด๋, ์ฃผ์ด์ง ์์ ์์๋ฅผ ๋ฐ๊พธ๋ฉด ์ ๋๋ค.
์๋ฅผ ๋ค์ด, 6๊ฐ์ ์๋ก ์ด๋ฃจ์ด์ง ์์ด์ด 1, 2, 3, 4, 5, 6์ด๊ณ , ์ฃผ์ด์ง ์ฐ์ฐ์๊ฐ ๋ง์ (+) 2๊ฐ, ๋บ์ (-) 1๊ฐ, ๊ณฑ์ (×) 1๊ฐ, ๋๋์ (÷) 1๊ฐ์ธ ๊ฒฝ์ฐ์๋ ์ด 60๊ฐ์ง์ ์์ ๋ง๋ค ์ ์๋ค. ์๋ฅผ ๋ค์ด, ์๋์ ๊ฐ์ ์์ ๋ง๋ค ์ ์๋ค.
- 1+2+3-4×5÷6
- 1÷2+3+4-5×6
- 1+2÷3×4-5+6
- 1÷2×3-4+5+6
์์ ๊ณ์ฐ์ ์ฐ์ฐ์ ์ฐ์ ์์๋ฅผ ๋ฌด์ํ๊ณ ์์์๋ถํฐ ์งํํด์ผ ํ๋ค. ๋, ๋๋์ ์ ์ ์ ๋๋์ ์ผ๋ก ๋ชซ๋ง ์ทจํ๋ค. ์์๋ฅผ ์์๋ก ๋๋ ๋๋ C++14์ ๊ธฐ์ค์ ๋ฐ๋ฅธ๋ค. ์ฆ, ์์๋ก ๋ฐ๊พผ ๋ค ๋ชซ์ ์ทจํ๊ณ , ๊ทธ ๋ชซ์ ์์๋ก ๋ฐ๊พผ ๊ฒ๊ณผ ๊ฐ๋ค. ์ด์ ๋ฐ๋ผ์, ์์ ์ 4๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๊ณ์ฐํด๋ณด๋ฉด ์๋์ ๊ฐ๋ค.
- 1+2+3-4×5÷6 = 1
- 1÷2+3+4-5×6 = 12
- 1+2÷3×4-5+6 = 5
- 1÷2×3-4+5+6 = 7
N๊ฐ์ ์์ N-1๊ฐ์ ์ฐ์ฐ์๊ฐ ์ฃผ์ด์ก์ ๋, ๋ง๋ค ์ ์๋ ์์ ๊ฒฐ๊ณผ๊ฐ ์ต๋์ธ ๊ฒ๊ณผ ์ต์์ธ ๊ฒ์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ์์ ๊ฐ์ N(2 ≤ N ≤ 11)๊ฐ ์ฃผ์ด์ง๋ค. ๋์งธ ์ค์๋ A1, A2, ..., AN์ด ์ฃผ์ด์ง๋ค. (1 ≤ Ai ≤ 100) ์ ์งธ ์ค์๋ ํฉ์ด N-1์ธ 4๊ฐ์ ์ ์๊ฐ ์ฃผ์ด์ง๋๋ฐ, ์ฐจ๋ก๋๋ก ๋ง์ (+)์ ๊ฐ์, ๋บ์ (-)์ ๊ฐ์, ๊ณฑ์ (×)์ ๊ฐ์, ๋๋์ (÷)์ ๊ฐ์์ด๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ๋ง๋ค ์ ์๋ ์์ ๊ฒฐ๊ณผ์ ์ต๋๊ฐ์, ๋์งธ ์ค์๋ ์ต์๊ฐ์ ์ถ๋ ฅํ๋ค. ์ฐ์ฐ์๋ฅผ ์ด๋ป๊ฒ ๋ผ์๋ฃ์ด๋ ํญ์ -10์ต๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๊ณ , 10์ต๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์ค๋ ์ ๋ ฅ๋ง ์ฃผ์ด์ง๋ค. ๋ํ, ์์์๋ถํฐ ๊ณ์ฐํ์ ๋, ์ค๊ฐ์ ๊ณ์ฐ๋๋ ์์ ๊ฒฐ๊ณผ๋ ํญ์ -10์ต๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๊ณ , 10์ต๋ณด๋ค ์๊ฑฐ๋ ๊ฐ๋ค.
โ๏ธ ํ์ด
๋ฐฑํธ๋ํน ๋ฌธ์ ๋ผ๊ณ ํด์ ํ์๋๋ฐ...DFS๋๊น ๋ญ ๋ง๊ธด ํ๋ค.
๐ก ์ฌ์ฉํ ์ ์๋ ์ฐ์ฐ์์ ๊ฐ์๋ ๋ฐฐ์ด์ ๋ด๋๋ค
โ๏ธ N-1๊ฐ์ ์ฐ์ฐ์๋ฅผ ๋ชจ๋ ์ธ ๋๊น์ง, ์ฌ์ฉ ๊ฐ๋ฅํ ๋ชจ๋ ์ฐ์ฐ์๋ฅผ ํ๋์ฉ ์จ๋ณด๋ฉฐ DFS ํ์์ ํ๋ค.
โ๏ธ ํน์ ์ฐ์ฐ์์ ์ฌ์ฉ๊ฐ๋ฅ ์ฌ๋ถ๋ ๋ฐฐ์ด์ ํด๋น ์ธ๋ฑ์ค์ ๋ด๊ฒจ์ง ๊ฐ์ด 0์ด ์๋์ผ๋ก ํ๋จํ๋ค.
๐ป ์์ค์ฝ๋: ์๋ฐ(Java)
public class Main_๋ฐฑ์ค_14888_์ฐ์ฐ์๋ผ์๋ฃ๊ธฐ_์ค๋ฒI {
static int N, max=-1000000000, min=1000000000;
static int[] numbers, op;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
numbers = new int[N];
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
numbers[i] = Integer.parseInt(st.nextToken());
}
op = new int[4]; // 0:+ /1:- /2:* /3:/
st = new StringTokenizer(br.readLine());
for (int i = 0; i < 4; i++) {
op[i] = Integer.parseInt(st.nextToken());
}//input
dfs(1, numbers[0]);
System.out.println(max);
System.out.println(min);
}//end of class
private static void dfs(int idx, int num) {
if(idx==N) {
max = Math.max(max, num);
min = Math.min(min, num);
return;
}
for (int i = 0; i < 4; i++) {
if(op[i]<=0) continue;
op[i]--;
switch(i) {
case 0:// +
dfs(idx+1, num+numbers[idx]);
break;
case 1:// -
dfs(idx+1, num-numbers[idx]);
break;
case 2:// *
dfs(idx+1, num*numbers[idx]);
break;
case 3:// /
dfs(idx+1, num/numbers[idx]);
}
op[i]++;
}
}
}//end of main
๐ ๐ ๐
๏ผฐ๏ฝ๏ฝ๏ฝ๏ฝ ๏ฝ ๏ผข๏ฝ ๏ผณ๏ผก๏ผน
๐๐ฉ๐ข๐ฏ๐ฌ๐ด ๐ง๐ฐ๐ณ ๐ณ๐ฆ๐ข๐ฅ๐ช๐ฏ๐จ