https://www.acmicpc.net/problem/14888
N이면서, 길이가 적어도 L인 가장 짧은 연속된 음이 아닌 정수 리스트를 구해라!
입력
- 첫째줄: 수의 개수 N
- N은 2이상 11이하의 자연수
- 둘째줄: 자연수가 N개 주어진다.
- 셋째줄: 합이 N-1인 4개의 정수가 주어진다. 차례대로
+, -, *, /
의 개수다.
출력
- 첫째줄에는 만들 수 있는 식의 최댓값을, 둘째줄에는 최솟값을 출력한다.
문제를 보자마자 재귀로 간단하게 풀면 될것같다고 생각했다.
이유는 재귀함수 스택이 많아봐야 수의 개수 최대치인 11이었기 때문이다.
자세한 방법은 재귀함수로 기호의 순서를 구한후 기호의 갯수가 N-1개가 되면 그때
계산을 실시한다. 그리고 그 결과를 min, max와 비교하고 마지막에 결과를 출력한다.
const stdin = (
process.platform === "linux"
? require("fs").readFileSync(0, "utf-8")
: `
2
5 6
0 0 1 0
`
)
.trim()
.split("\n");
const input = (() => {
let line = 0;
return () => stdin[line++].split(" ").map((v) => +v);
})();
const N = +input();
const nums = input();
const cals = input();
let min = Infinity;
let max = -Infinity;
const calculateSum = (arr) => {
let sum = nums[0];
for (let i = 1; i < N; i++) {
const sign = arr[i - 1];
if (sign === 0) sum += nums[i];
else if (sign === 1) sum -= nums[i];
else if (sign === 2) sum *= nums[i];
// 음수 / 양수 : 양수로 바뀐뒤 몫 취하고 음수로 바꿈
else {
if (sum < 0) {
sum = Math.floor(Math.abs(sum) / nums[i]) * -1;
} else {
sum = Math.floor(sum / nums[i]);
}
}
}
return sum;
};
const getPermutation = (arr, op) => {
if (arr.length === N - 1) {
const sum = calculateSum(arr);
min = Math.min(min, sum);
max = Math.max(max, sum);
return;
}
for (let i = 0; i < 4; i++) {
if (op[i] === 0) continue;
const newOp = [...op];
newOp[i]--;
getPermutation([...arr, i], newOp);
}
};
getPermutation([], cals);
console.log(`${max}\n${min}`);