danbibibi
article thumbnail

문제

문제 바로가기> BOJ 14888번: 연산자 끼워넣기

 

14888번: 연산자 끼워넣기

첫째 줄에 수의 개수 N(2 ≤ N ≤ 11)가 주어진다. 둘째 줄에는 A1, A2, ..., AN이 주어진다. (1 ≤ Ai ≤ 100) 셋째 줄에는 합이 N-1인 4개의 정수가 주어지는데, 차례대로 덧셈(+)의 개수, 뺄셈(-)의 개수, 

www.acmicpc.net

 

풀이

모든 경우의 수를 탐색하며, 최댓값과 최솟값을 구해주면 된다!

 

C++

#include<iostream>
#define MAX 12
using namespace std;

int N;
int max_val = -100000001; // 만들 수 있는 식의 결과의 최댓값
int min_val = 100000001; // 최솟값
int A[MAX], oper[4]; // +. -, *, /

void input() {
	cin >> N;
	for (int i = 0; i < N; i++) cin >> A[i];
	for (int i = 0; i < 4; i++) cin >> oper[i];
}

void dfs(int res, int idx) {
	if (idx == N) {
		max_val = max(res, max_val);
		min_val = min(res, min_val);
		return;
	}
	for (int i = 0; i < 4; i++) {
		if (oper[i]) { // 사용할 수 있는 경우
			oper[i]--;
			if (i == 0) dfs(res + A[idx], idx + 1);
			if (i == 1) dfs(res - A[idx], idx + 1);
			if (i == 2) dfs(res * A[idx], idx + 1);
			if (i == 3) dfs(res / A[idx], idx + 1);
			oper[i]++;
		}
	}
}

int main() {
	ios_base::sync_with_stdio(0); cin.tie(0);
	input();
	dfs(A[0], 1);
	cout << max_val << "\n" << min_val;
}

 

Java

import java.io.*;
import java.util.*;

public class Main {
	
	static int N;
	static int min_val = Integer.MAX_VALUE, max_val = Integer.MIN_VALUE;
	static int[] operand, operator;
	public static void main(String[] args) throws Exception {
		// System.setIn(new FileInputStream("res/input.txt"));
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));	
		
		N = Integer.parseInt(br.readLine());
		operand = new int[N];
		operator = new int[4]; // 차례대로 덧셈(+)의 개수, 뺄셈(-)의 개수, 곱셈(×)의 개수, 나눗셈(÷)의 개수
		
		StringTokenizer st = new StringTokenizer(br.readLine());
		for(int i=0; i<N; i++) operand[i] = Integer.parseInt(st.nextToken());
		
		st = new StringTokenizer(br.readLine());
		for(int i=0; i<4; i++) operator[i] = Integer.parseInt(st.nextToken());
		
		solution(1, operand[0]);
		System.out.println(max_val);
		System.out.println(min_val);
		br.close();
	}
	
	private static void solution(int cnt, int val) {
		if(cnt == N) {
			min_val = Math.min(min_val, val);
			max_val = Math.max(max_val, val);
			return ;
		}
		
		for(int i=0; i<4; i++) {
			if(operator[i]>0) {
				operator[i]--;
				if(i==0) solution(cnt+1, val+operand[cnt]);
				else if(i==1) solution(cnt+1, val-operand[cnt]);
				else if(i==2) solution(cnt+1, val*operand[cnt]);
				else if(i==3) solution(cnt+1, val/operand[cnt]);
				operator[i]++;
			}
		}

	}
}

'문제 풀이 > SW 역량 테스트' 카테고리의 다른 글

BOJ 14502번: 연구소  (0) 2023.01.11
BOJ 14889번: 스타트와 링크  (0) 2023.01.11
BOJ 15686번: 치킨 배달  (0) 2023.01.10
BOJ 14503번: 로봇 청소기  (0) 2023.01.08
BOJ 16236번: 아기상어  (0) 2022.12.26
profile

danbibibi

@danbibibi

꿈을 꾸는 시간은 멈춰 있는 것이 아냐 두려워하지 마 멈추지 마 푸른 꿈속으로