https://www.acmicpc.net/problem/1541
1541번: 잃어버린 괄호
첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다
www.acmicpc.net
문제 해결법을 떠올리는 건 쉽다. 연산의 최소 값을 구해야 하므로 -가 붙는 수를 최대한 크게 만들면 된다.
예를 들어 다음과 같이 식이 있다고 가정하자.
a + b - c + d + e -f
그러면 -의 값을 최대한 크게 만들기 위해 c, d, e를 한 묶음으로 묶어주면 된다.
문제는 값이 입력될 때 숫자와 연산자를 어떻게 구분하고 어떻게 저장할지 고민이었는데..
-를 기준으로 먼저 나눈 후, 각 덩어리들의 합을 구하고 그들 간에 - 연산을 해주면 된다.
즉 위 예제에서 (a + b), (c + d + e), f 이렇게 총 3개의 덩어리가 나온다. 그리고 (첫 번째 덩어리) - (두 번째 덩어리 값) - (세 번째 덩어리 값)이 답이 된다!
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
// 시간복잡도: O(N)
public class Main {
static int answer = 0; // 연산의 최소값
static List<Integer> numbers = new ArrayList<>();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), "-");
while (st.hasMoreTokens()) {
numbers.add(getSum(st.nextToken()));
}
answer = numbers.get(0);
for (int i = 1; i < numbers.size(); i++) {
answer -= numbers.get(i);
}
System.out.println(answer);
}
private static Integer getSum(String str) {
int sum = 0;
String[] arr = str.split("\\+");
for (String s : arr) {
sum += Integer.parseInt(s);
}
return sum;
}
}
'CS > Algorism' 카테고리의 다른 글
[백준] 12100. 2048 (Easy) (0) | 2024.01.02 |
---|---|
[백준] 1697. 숨바꼭질 (0) | 2023.12.29 |
[백준] 4179. 불! (0) | 2023.12.28 |
[백준] 7576. 토마토 (1) | 2023.12.26 |
[백준] 2178. 미로 탐색 (0) | 2023.12.26 |