๊ธ€ ์ž‘์„ฑ์ž: ๋˜ฅํด๋ฒ .
๋ฐ˜์‘ํ˜•
ํ•ด๋‹น ๊ธ€์˜ ๋‚ด์šฉ์€ ์ตœ์ ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์•„๋‹Œ ๊ธ€์“ด์ด์˜ ์ฃผ๊ด€์ ์ธ ํ’€์ด์ž…๋‹ˆ๋‹ค. ๋” ์ข‹์€ ํ’€์ด๊ฐ€ ์žˆ๋‹ค๋ฉด ๋Œ“๊ธ€๋กœ ํ”ผ๋“œ๋ฐฑ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค(__)

 

๋งํฌ


https://www.acmicpc.net/problem/14888

 

14888๋ฒˆ: ์—ฐ์‚ฐ์ž ๋ผ์›Œ๋„ฃ๊ธฐ

์ฒซ์งธ ์ค„์— ์ˆ˜์˜ ๊ฐœ์ˆ˜ N(2 ≤ N ≤ 11)๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„์—๋Š” A1, A2, ..., AN์ด ์ฃผ์–ด์ง„๋‹ค. (1 ≤ Ai ≤ 100) ์…‹์งธ ์ค„์—๋Š” ํ•ฉ์ด N-1์ธ 4๊ฐœ์˜ ์ •์ˆ˜๊ฐ€ ์ฃผ์–ด์ง€๋Š”๋ฐ, ์ฐจ๋ก€๋Œ€๋กœ ๋ง์…ˆ(+)์˜ ๊ฐœ์ˆ˜, ๋บ„์…ˆ(-)์˜ ๊ฐœ์ˆ˜, ๏ฟฝ๏ฟฝ

www.acmicpc.net

 

 

๋ฌธ์ œ ์„ค๋ช…


 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,...,2 AN์ด ์ฃผ์–ด์ง„๋‹ค. (1 ≤ Ai ≤ 100) ์…‹์งธ ์ค„์—๋Š” ํ•ฉ์ด N-1์ธ 4๊ฐœ์˜ ์ •์ˆ˜๊ฐ€ ์ฃผ์–ด์ง€๋Š”๋ฐ, ์ฐจ๋ก€๋Œ€๋กœ ๋ง์…ˆ(+)์˜ ๊ฐœ์ˆ˜, ๋บ„์…ˆ(-)์˜ ๊ฐœ์ˆ˜, ๊ณฑ์…ˆ(×)์˜ ๊ฐœ์ˆ˜, ๋‚˜๋ˆ—์…ˆ(÷)์˜ ๊ฐœ์ˆ˜์ด๋‹ค. 

 

 ์ถœ๋ ฅ: ์ฒซ์งธ ์ค„์— ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์‹์˜ ๊ฒฐ๊ณผ์˜ ์ตœ๋Œ“๊ฐ’์„, ๋‘˜์งธ ์ค„์—๋Š” ์ตœ์†Ÿ๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค. ์—ฐ์‚ฐ์ž๋ฅผ ์–ด๋–ป๊ฒŒ ๋ผ์›Œ ๋„ฃ์–ด๋„ ํ•ญ์ƒ -10์–ต๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ , 10์–ต๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๋Š” ์ž…๋ ฅ๋งŒ ์ฃผ์–ด์ง„๋‹ค. ๋˜ํ•œ, ์•ž์—์„œ๋ถ€ํ„ฐ ๊ณ„์‚ฐํ–ˆ์„ ๋•Œ, ์ค‘๊ฐ„์— ๊ณ„์‚ฐ๋˜๋Š” ์‹์˜ ๊ฒฐ๊ณผ๋„ ํ•ญ์ƒ -10์–ต๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ , 10์–ต๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™๋‹ค.

 

 

 

์ž…์ถœ๋ ฅ ์˜ˆ


<์ž…๋ ฅ 1>

2
5 6
0 0 1 0

 

<์ถœ๋ ฅ 1>

30
30

 

<์ž…๋ ฅ 2>

3
3 4 5
1 0 1 0

 

<์ถœ๋ ฅ 2>

35
17

 

<์ž…๋ ฅ 3>

6
1 2 3 4 5 6
2 1 1 1

 

<์ถœ๋ ฅ 3>

54
-24

 

 

ํ’€์ด


[Golang]

package main

import (
	"bufio"
	"fmt"
	"math"
	"os"
)

const (
	OpNone = iota
	OpPlus
	OpSub
	OpMul
	OpDiv
)

var Max = math.MinInt32
var Min = math.MaxInt32

func main() {
	r := bufio.NewReader(os.Stdin)
	var num int
	_, _ = fmt.Fscanf(r, "%d\n", &num)
	numSlice := make([]int, num)
	for i := 0; i < num; i++ {
		if i == num-1 {
			_, _ = fmt.Fscanf(r, "%d\n", &numSlice[i])
		} else {
			_, _ = fmt.Fscanf(r, "%d", &numSlice[i])
		}
	}
	opSlice := make([]int, 4)
	for i := 0; i < 4; i++ {
		_, _ = fmt.Fscanf(r, "%d", &opSlice[i])
	}
	calculate(opSlice, OpNone, numSlice, numSlice[0])
	fmt.Printf("%d\n%d", Max,Min)
}

func calculate(opSlice []int, op int, numSlice []int, current int) {
	copyOpSlice := make([]int, 4)
	copy(copyOpSlice, opSlice)

	if op != OpNone {
		copyOpSlice[op-1]--

		switch op {
		case OpPlus:
			{
				current += numSlice[0]
			}
		case OpSub:
			{
				current -= numSlice[0]
			}
		case OpMul:
			{
				current *= numSlice[0]
			}
		case OpDiv:
			{
				current /= numSlice[0]
			}
		}
	}

	isExist := false
	for opIndex := 0; opIndex < len(opSlice); opIndex++ {
		if copyOpSlice[opIndex] == 0 {
			continue
		} else {
			isExist = true
		}

		calculate(copyOpSlice, opIndex+1, numSlice[1:], current)
	}

	if !isExist {
		if Max < current {
			Max = current
		}
		if Min > current {
			Min = current
		}
	}
}

 

[C++]

#include <iostream>
#include <algorithm>

int num = 0;
int max = -1000000000;
int min = 1000000000;
int numArr[11] = { 0, };

enum class Operation
{
	None = 0,
	Plus = 1,
	Sub = 2,
	Mul = 3,
	Div = 4,
};

void calculate(int* opArr, Operation op, int numIndex, int current)
{
	switch (op)
	{
	case Operation::Plus:
	{
		current += numArr[numIndex];
		break;
	}
	case Operation::Sub:
	{
		current -= numArr[numIndex];
		break;
	}
	case Operation::Mul:
	{
		current *= numArr[numIndex];
		break;
	}
	case Operation::Div:
	{
		current /= numArr[numIndex];
		break;
	}
	}

	int copyOpArr[4] = { 0, };
	std::copy(opArr, opArr+4, copyOpArr);
	if (op != Operation::None)
	{
		--copyOpArr[static_cast<int>(op) - 1];
	}

	bool isExist = false;
	for (int opIndex = 0; opIndex < 4; opIndex++)
	{
		if (copyOpArr[opIndex] == 0)
		{
			continue;
		}
		else
		{
			isExist = true;
		}
		calculate(copyOpArr, Operation(opIndex+1), numIndex+1, current);
	}
	if (!isExist)
	{
		if (min > current)
		{
			min = current;
		}
		if (max < current)
		{
			max = current;
		}
	}
}

int main()
{
	std::cin.tie(NULL);
	std::ios::sync_with_stdio(false);
	std::cin >> num;

	for (int i = 0; i < num; i++)
	{
		std::cin >> numArr[i];
	}
	int opArr[4] = { 0, };
	for (int i = 0; i < 4; i++)
	{
		std::cin >> opArr[i];
	}

	calculate(opArr, Operation::None, 0, numArr[0]);

	std::cout << max << '\n' << min;

	return 0;
}

 

[Java]

import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {

	public static int[] su;
	public static BigInteger min = new BigInteger(Integer.MAX_VALUE + "");
	public static BigInteger max = new BigInteger(Integer.MIN_VALUE + "");

	public static class TreeNode {
		public BigInteger sum = new BigInteger("0");
		public int lev;
		public int treeGiho;
		public List<TreeNode> treeList = new ArrayList<>();

		public TreeNode(BigInteger sum, int putGiho, int lev, int[] giho) {
			switch (putGiho) {
			case 0:
				sum = sum.add(new BigInteger(su[lev]+""));
				break;
			case 1:
				sum = sum.subtract(new BigInteger(su[lev]+""));
				break;
			case 2:
				sum = sum.multiply(new BigInteger(su[lev]+""));
				break;
			case 3:
				sum = sum.divide(new BigInteger(su[lev]+""));
				break;
			}

			if (lev == su.length - 1) {
				if(min.compareTo(sum) > 0){
					min = sum;
				}
				if(max.compareTo(sum) < 0){
					max = sum;
				}
			} else {
				for (int i = 0; i < 4; i++) {
					int[] tempGiho = giho.clone();
					if (tempGiho[i] != 0) {
						tempGiho[i]--;
						treeList.add(new TreeNode(sum, i, lev + 1, tempGiho));
					}
				}
			}
		}

	}

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int num = sc.nextInt();
		su = new int[num];
		int[] giho = new int[4];

		for (int i = 0; i < num; i++) {
			su[i] = sc.nextInt();
		}
		for (int i = 0; i < 4; i++) {
			giho[i] = sc.nextInt();
		}
		TreeNode[] resultTree = new TreeNode[4];
		for (int i = 0; i < 4; i++) {
			int[] tempGiho = giho.clone();
			if (tempGiho[i] != 0) {
				tempGiho[i]--;
				resultTree[i] = new TreeNode(new BigInteger(su[0]+""), i, 1, tempGiho);
			}

		}
		System.out.println(max);
		System.out.println(min);

	}
}

 

 

 

ํ’€์ด ์„ค๋ช…


 

 Go, C++๋Š” ์žฌ๊ท€ ํ•จ์ˆ˜, Java๋Š” ํŠธ๋ฆฌ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•ด์„œ ํ’€์—ˆ๋‹ค.

 ์ทจ์ค€์ƒ ๋•Œ Java๋กœ ํ’€์—ˆ๋˜ ํ”์ ์ด ์žˆ์–ด์„œ ์ด๋ฒˆ์—๋Š” Java ์†Œ์Šค์ฝ”๋“œ๋„ ๊ฐ™์ด ์ฒจ๋ถ€ํ–ˆ๋‹ค.

 

 ์—ฐ์‚ฐํ•  ์ˆซ์ž๋“ค๊ณผ ์—ฐ์‚ฐ์ž์˜ ์ˆ˜๋ฅผ ๋ฐฐ์—ด๋กœ ๋ฐ›๋Š”๋‹ค.
A1 A2 A3
3 4 5
+ - * /
1 0 1 0

 

 

 

 ์—ฐ์‚ฐ์ž์˜ ์ˆ˜๊ฐ€ ๋“ค์–ด์žˆ๋Š” ๋ฐฐ์—ด์„ ์ฐจ๋ก€๋Œ€๋กœ ์กฐ์‚ฌํ•œ๋‹ค,
ํ•ด๋‹น ์—ฐ์‚ฐ์ž๊ฐ€ 0 ์ด์ƒ์ด๋ผ๋ฉด ํŠธ๋ฆฌ๋กœ ํƒœ์šฐ๋˜, ํ•จ์ˆ˜๋กœ ํƒœ์šฐ๋˜ ์—ฐ์‚ฐ์„ ์‹คํ–‰์‹œํ‚ค๊ณ  -1์„ ํ•ด์ค€๋‹ค.

 ๊ฐ€์žฅ ๋จผ์ € +๊ฐ€ 1์ด๋ฏ€๋กœ A1 + A2๋ฅผ ํ•ด์ค€๋‹ค. (3 + 4 = 7)
๊ทธ ํ›„ +์˜ ๊ฐ’์„ -1 ์‹œ์ผœ์ค€๋‹ค.

๋‹ค์‹œ ํ•œ๋ฒˆ ์—ฐ์‚ฐ์ž์˜ ์ˆ˜๊ฐ€ ๋“ค์–ด์žˆ๋Š” ๋ฐฐ์—ด์„ ์ฐจ๋ก€๋Œ€๋กœ ์กฐ์‚ฌํ•ด์„œ ๊ฒฐ๊ณผ ๊ฐ’์„ ์—ฐ์‚ฐํ•œ๋‹ค.
+ - * /
0 0 1 0

 

 ๋‚จ์€ ์—ฐ์‚ฐ์ž๊ฐ€ *์ด๋ฏ€๋กœ 7 * 5 = 35๋ผ๋Š” ๊ฐ’์ด ๋‚˜์˜จ๋‹ค.
ํ•ด๋‹น ๊ฐ’์ด ์ตœ๋Œ“๊ฐ’์ด๋ฉด ์ตœ๋Œ“๊ฐ’์œผ๋กœ ์„ธํŒ…ํ•˜๊ณ  ์ตœ์†Ÿ๊ฐ’์ด๋ผ๋ฉด ์ตœ์†Ÿ๊ฐ’์œผ๋กœ ์„ธํŒ…ํ•œ๋‹ค.
+ - * /
0 0 0 0

 

 

๋‹ค์‹œ ๋Œ์•„๊ฐ€, ์ด๋ฒˆ์—๋Š” * ์—ฐ์‚ฐ ๋จผ์ € ์‹คํ–‰ํ•ด์„œ ๊ฐ’์„ ์—ฐ์‚ฐํ•œ๋‹ค. (๊ทธ ์ดํ›„ ๊ณผ์ •์€ ์œ„์™€ ๊ฐ™๋‹ค)
3 * 4 = 12...
+ - * /
1 0 1 0

 

๋ฐ˜์‘ํ˜•