재채기는 H

백준 14888 - 연산자 끼워넣기 JAVA 본문

알고리즘

백준 14888 - 연산자 끼워넣기 JAVA

에취~H 2020. 7. 24. 11:17
반응형

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

 

14888번: 연산자 끼워넣기

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

www.acmicpc.net

 

 

DFS를 이용해서 문제를 해결했다.

solve메서드 안에 op라는 일차원 배열을

for문으로 반복시켰을 때 값이 0이 아니면 연산자를 사용할 수 있다는 것을 의미한다. 

또한 for문의 i인덱스는 순서대로 +, -, *, / 연산자를 의미하기 때문에 switch문을 활용하여 깊이 우선 탐색하였다.

모든 값들의 합을 리스트에 담아 정렬시킨 후 리스트의 맨 앞과 맨 뒤의 값을 뽑아 가장 큰 값과 가장 작은 값을 출력했다.

 

문제는 한 30~50분 안에 풀었던 거 같다. 난이도에 비해서 시간이 쫌 걸렸다. 

op배열의 값을 어떻게 꺼내서 사용할지 쫌 생각했던 문제였다.

 

import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;

public class 백준_연산자끼워넣기_14888 {
	static int N;
	static int[] A;
	static int[] op = new int[4];
	static ArrayList<Integer> list = new ArrayList<>();
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		N = sc.nextInt();
		A = new int[N];
		for (int i = 0; i < N; i++) {
			A[i] = sc.nextInt();
		}
		for (int i = 0; i < 4; i++) {
			op[i] = sc.nextInt();
		}
		
		solve(1, A[0]);
		Collections.sort(list);
		System.out.println(list.get(list.size()-1));
		System.out.println(list.get(0));
	}

	static void solve(int depth, int sum) {
		if(depth==N) {
			list.add(sum);
			return;
		}
		for(int i=0;i<4;i++) {
			if(op[i]==0) {
				continue;
			}
			op[i]-=1;
			switch(i){
				case 0:
					solve(depth+1,sum+A[depth]);
					break;
				case 1:
					solve(depth+1,sum-A[depth]);
					break;
				case 2:
					solve(depth+1,sum*A[depth]);
					break;
				case 3:
					solve(depth+1,sum/A[depth]);
					break;
			}
			op[i]+=1;
		}
	}
}
반응형

'알고리즘' 카테고리의 다른 글

백준 15683 - 감시 JAVA  (0) 2020.07.25
백준 14889 - 스타트와 링크 JAVA  (0) 2020.07.24
백준 14503 - 로봇 청소기 JAVA  (0) 2020.07.22
백준 14502 - 연구소 JAVA  (0) 2020.07.22
백준 14499 - 주사위 굴리기 JAVA  (0) 2020.07.21
Comments