320x100
문제 : www.acmicpc.net/problem/14888
N의 범위가 2~11 이다. 백트래킹으로 돌려도 될만한 시간이다.
정수집합을 앞에서부터 탐색해가면서 가능한 부호를 모두 돌려봐서 나오는 수들 중 최대값, 최소값을 구한다.
pair<int, int> answer;
// arr : 정수형 배열
// signCnt : 부호 개수,
// ind : arr 탐색 중인 인덱스
// result : 이때까지 계산한 결과값
// sign : arr[ind]에 적용할 부호. arr[ind] 앞에 들어갈 부호
void backtracking(int[] arr, int[] signCnt, int ind, int result, int sign) {
// 경계값 확인
sign 부호 확인
+ 인 경우: result += arr[ind]
- 인 경우: result -= arr[ind]
* 인 경우: result *= arr[ind]
/ 인 경우: result /= arr[ind]
// 정답 갱신
answer = 기존 answer 값과 result 비교 후 최대값, 최소값 갱신
for(int sign=0; sign<signCnt.size(); sign++){
signCnt[sign]이 0개 이하라면 더 이상 사용 불가능 -> 다음 for문 확인
signCnt[sign] -= 1;
// 현재 기호 넣고 ind+1 인덱스 확인하는 재귀함수 호출
backtracking(arr, signCnt, ind+1, result, sign);
signCnt[sign] += 1;
}
}
처음 시작은 0에서 +arr[0]이기 때문에
backtracking(arr, signCnt, 0, 0, PLUS);
sign에 PLUS를 넣고 호출한다.
320x100
'알고리즘 문제 > BOJ' 카테고리의 다른 글
[BOJ][1346] 구슬 탈출 2 (0) | 2020.11.01 |
---|---|
[BOJ][16236] 아기 상어 (0) | 2020.10.31 |
[BOJ][15686] 치킨 배달 (0) | 2020.10.20 |
[BOJ][2143] 두 배열의 합 (0) | 2020.07.08 |
[BOJ][11585] 속타는 저녁 메뉴 (0) | 2020.04.08 |
댓글