https://www.acmicpc.net/problem/16637
16637번: 괄호 추가하기
길이가 N인 수식이 있다. 수식은 0보다 크거나 같고, 9보다 작거나 같은 정수와 연산자(+, -, ×)로 이루어져 있다. 연산자 우선순위는 모두 동일하기 때문에, 수식을 계산할 때는 왼쪽에서부터 순
www.acmicpc.net
풀이
DFS(재귀함수)를 사용하여 풀이하였다.
main() 로직
1. 수식에서 숫자와 연산자를 구분하여 각각 ArrayList<Integer> numbers, ArrayList<Character> operators에 저장한다.
2. 재귀함수를 호출하여 DFS를 수행한다.
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
String expression = br.readLine();
for (int i = 0; i < n; i++) {
char ch = expression.charAt(i);
if (Character.isDigit(ch)) {
numbers.add(ch-'0');
}
else operators.add(ch);
}
dfs(numbers.get(0), 0);
System.out.println(max);
void dfs(int num, int opIdx): num은 이전에 계산한 값, opIdx는 이번 연산에 사용할 연산자의 인덱스다.
1. opIdx가 operators의 크기와 같거나 크다면 더 이상 연산을 진행하지 못하므로 max값과 비교하여 업데이트한다.
2. 괄호 없이 계산한 다음 dfs() 호출
3. 현재 연산자 다음에 연산자가 있다면, 다음 연산자에 괄호가 있다고 생각하여 값을 미리 계산하고, 그 값을 num과 이번 연산자를 사용하여 계산한 결과값으로 dfs() 호출
public static void dfs(int num, int opIdx) {
if (opIdx >= operators.size()) {
max = Math.max(max, num);
return;
}
// 괄호 없이 계산
int result = calc(num, numbers.get(opIdx+1), opIdx);
dfs(result, opIdx + 1);
// 오른쪽에 있는 2개의 값에 괄호 추가하여 계산
if (opIdx + 1 < operators.size()) {
result = calc(numbers.get(opIdx+1), numbers.get(opIdx+2), opIdx+1);
result = calc(num, result, opIdx);
dfs(result, opIdx+2);
}
}
코드
import java.io.*;
import java.util.*;
public class Main {
static ArrayList<Integer> numbers = new ArrayList<>();
static ArrayList<Character> operators = new ArrayList<>();
static int max = Integer.MIN_VALUE;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
String expression = br.readLine();
for (int i = 0; i < n; i++) {
char ch = expression.charAt(i);
if (Character.isDigit(ch)) {
numbers.add(ch-'0');
}
else operators.add(ch);
}
dfs(numbers.get(0), 0);
System.out.println(max);
}
public static void dfs(int num, int opIdx) {
if (opIdx >= operators.size()) {
max = Math.max(max, num);
return;
}
// 괄호 없이 계산
int result = calc(num, numbers.get(opIdx+1), opIdx);
dfs(result, opIdx + 1);
// 오른쪽에 있는 2개의 값에 괄호 추가하여 계산
if (opIdx + 1 < operators.size()) {
result = calc(numbers.get(opIdx+1), numbers.get(opIdx+2), opIdx+1);
result = calc(num, result, opIdx);
dfs(result, opIdx+2);
}
}
public static int calc(int num, int nextNum, int opIdx) {
char operator = operators.get(opIdx);
switch (operator) {
case '+':
return num + nextNum;
case '-':
return num - nextNum;
case '*':
return num * nextNum;
}
return 0;
}
}
참고
728x90
'Algorithm 문제 풀이 > 백준' 카테고리의 다른 글
[백준] 2003번 : 수들의 합 - 자바[Java] (0) | 2023.07.25 |
---|---|
[백준] 17135번 : 캐슬 디펜스 - 자바[Java] (0) | 2023.07.05 |
[백준] 17070번 : 파이프 옮기기 1 - 자바[Java] (0) | 2023.06.27 |
[백준] 2636번 : 치즈 - 자바[Java] (0) | 2023.06.24 |
[백준] 16234번 : 인구 이동 - 자바[Java] (0) | 2023.06.23 |