Seren dev's blog
article thumbnail

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

 

16637번: 괄호 추가하기

길이가 N인 수식이 있다. 수식은 0보다 크거나 같고, 9보다 작거나 같은 정수와 연산자(+, -, ×)로 이루어져 있다. 연산자 우선순위는 모두 동일하기 때문에, 수식을 계산할 때는 왼쪽에서부터 순

www.acmicpc.net

1. 풀이

DFS(재귀함수)를 사용하여 풀이하였다.

 

main() 로직

1. 수식에서 숫자와 연산자를 구분하여 각각 ArrayList<Integer> numbers, ArrayList<Character> operators에 저장한다.

2. 재귀함수를 호출하여 DFS를 수행한다.

<java />
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() 호출

<java />
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); } }

 

2. 코드

<java />
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; } }

 

2.1. 참고

 

728x90
profile

Seren dev's blog

@Seren dev

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!