[C++, Golang, Java] 14888๋ฒ: ์ฐ์ฐ์ ๋ผ์๋ฃ๊ธฐ
ํด๋น ๊ธ์ ๋ด์ฉ์ ์ต์ ์ ์๊ณ ๋ฆฌ์ฆ์ด ์๋ ๊ธ์ด์ด์ ์ฃผ๊ด์ ์ธ ํ์ด์ ๋๋ค. ๋ ์ข์ ํ์ด๊ฐ ์๋ค๋ฉด ๋๊ธ๋ก ํผ๋๋ฐฑ ๋ถํ๋๋ฆฝ๋๋ค(__)
๋งํฌ
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,...,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 |
'Algorithm > ๋ฐฑ์ค ์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[C++, Golang] 12865๋ฒ: ํ๋ฒํ ๋ฐฐ๋ญ (0) | 2020.07.17 |
---|---|
[C++, Golang] 2798๋ฒ: ๋ธ๋์ญ (0) | 2020.07.14 |
[C++, Golang] 11729๋ฒ: ํ๋ ธ์ด ํ ์ด๋ ์์ (0) | 2020.07.10 |
[C++, Golang] 2012๋ฒ: ๋ฑ์ ๋งค๊ธฐ๊ธฐ (0) | 2020.07.08 |
[C++] 2447๋ฒ: ๋ณ์ฐ๊ธฐ - 10 (0) | 2020.07.07 |
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote
๋ค๋ฅธ ๊ธ
-
[C++, Golang] 12865๋ฒ: ํ๋ฒํ ๋ฐฐ๋ญ
[C++, Golang] 12865๋ฒ: ํ๋ฒํ ๋ฐฐ๋ญ
2020.07.17 -
[C++, Golang] 2798๋ฒ: ๋ธ๋์ญ
[C++, Golang] 2798๋ฒ: ๋ธ๋์ญ
2020.07.14 -
[C++, Golang] 11729๋ฒ: ํ๋ ธ์ด ํ ์ด๋ ์์
[C++, Golang] 11729๋ฒ: ํ๋ ธ์ด ํ ์ด๋ ์์
2020.07.10 -
[C++, Golang] 2012๋ฒ: ๋ฑ์ ๋งค๊ธฐ๊ธฐ
[C++, Golang] 2012๋ฒ: ๋ฑ์ ๋งค๊ธฐ๊ธฐ
2020.07.08