sm 기술 블로그
123. 14888(연산자 끼워놓기) 본문
import java.util.*;
import java.io.*;
class Main {
static int N;
static int[] num;
static ArrayList<Integer> result = new ArrayList<>();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int[] operation = new int[4];
N = Integer.parseInt(br.readLine());
num = new int[N];
String[] numBits = br.readLine().split(" ");
for (int i = 0; i < numBits.length; i++) {
num[i] = Integer.parseInt(numBits[i]);
}
String[] opBits = br.readLine().split(" ");
for (int i = 0; i < 4; i++) {
operation[i] = Integer.parseInt(opBits[i]);
}
DFS(operation[0], operation[1], operation[2], operation[3], num[0], 1);
System.out.println(Collections.max(result));
System.out.println(Collections.min(result));
}
private static void DFS(int add, int sub, int mul, int div, int value, int depth) {
if (depth == N) {
result.add(value);
return;
}
if (add != 0) {
DFS(add - 1, sub, mul, div, value + num[depth], depth + 1);}
if (sub != 0) {
DFS(add, sub - 1, mul, div, value - num[depth], depth + 1);}
if (mul != 0) {
DFS(add, sub, mul - 1, div, value * num[depth], depth + 1);}
if (div != 0) {
DFS(add, sub, mul, div - 1, value / num[depth], depth + 1);}
}
}
문제요약
숫자와 연산자가 주어졌을때 나올 수 있는 연산을 모두 고르고, 최대값과 최소값을 출력하시오.
설명
깊이우선탐색을 이용하여 숫자와 모든연산자에서 나오는 결과를 result에 저장하고 최대값과 최소값을 출력하였다.
static int N;
static int[] num;
static ArrayList<Integer> result = new ArrayList<>();
위 변수는 Main, DFS 메소드에서 사용하기 때문에 전역변수로 선언하였다.
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int[] operation = new int[4];
N = Integer.parseInt(br.readLine());
num = new int[N];
String[] numBits = br.readLine().split(" ");
for (int i = 0; i < numBits.length; i++) {
num[i] = Integer.parseInt(numBits[i]);
}
String[] opBits = br.readLine().split(" ");
for (int i = 0; i < 4; i++) {
operation[i] = Integer.parseInt(opBits[i]);
}
각 값을 입력 받는 로직이다.
입력은 BufferedReader를 사용하였다.
private static void DFS(int add, int sub, int mul, int div, int value, int depth) {
if (depth == N) {
result.add(value);
return;
}
if (add != 0) {
DFS(add - 1, sub, mul, div, value + num[depth], depth + 1);}
if (sub != 0) {
DFS(add, sub - 1, mul, div, value - num[depth], depth + 1);}
if (mul != 0) {
DFS(add, sub, mul - 1, div, value * num[depth], depth + 1);}
if (div != 0) {
DFS(add, sub, mul, div - 1, value / num[depth], depth + 1);}
}
깊이와 숫자가 동일하면 끝까지 탐색을 마친것이다.
따라서 return을 통해 종료를 시켜준다.
add,sub,mul,div 각 연산자가 0이 아니라는것은 연산 횟수가 아직 남았다는 뜻과 같다.
처리 후 -1을 통해 다시 DFS 함수를 호출한다.
DFS(operation[0], operation[1], operation[2], operation[3], num[0], 1);
System.out.println(Collections.max(result));
System.out.println(Collections.min(result));
각 연산자의 값을 넘겨주고 처음 value는 num[0]이, depth는 1이 된다.
DFS를 통해 모든 결과값을 넣어 주었으므로 min과 max를 통해 출력을 해주면 된다.
.
'문제 > 백준_자바' 카테고리의 다른 글
125. 24416(알고리즘 수업 - 피보나치 수 1) (0) | 2022.07.02 |
---|---|
124. 14889(스타트와 링크) (0) | 2022.07.01 |
122. 2580(스도쿠) (0) | 2022.06.30 |
121. 9663(N-Queen) (0) | 2022.06.29 |
120. 15650(N과M (4)) (0) | 2022.06.29 |
Comments