반응형
문제 설명
- +, -, 숫자로 이루어진 식이 주어진다.
- '괄호를 적절히 쳐서' => '연산 순서를 적절히 선택해서'
=> 이 식의 값을 최소로 만들어 출력
문제 풀이
*와 / 가 없기 때문에 비교적 단순한 문제였다.
식의 결과가 최소가 되려면 - 연산을 수행하는 수가 최대가 되어야 한다.
이를 위해 처음에는 - 뒤의 + 연산을 모두 수행한 후 계산하면 될 것이라 추측했다.
하지만 이렇게 연산하면 - 앞의 + 들은 남아있게 된다. 이 + 들은 연산을 먼저하든 나중에하든 남은 - 를 연산하는 과정에서 결과값을 최소화하는데 도움을 주지 않기 때문에, 결과적으로 모든 + 를 연산한 후 남은 - 를 연산하도록 구현했다.
따라서 deque에 숫자, queue에 연산기호를 넣고, + 연산기호가 사용되는 수들을 먼저 연산했다.
이렇게 남은 수 중 맨 앞의 수를 제외한 나머지는 전부 - 연산을 수행하므로 최소값을 구할 수 있다.
문제 풀이 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.LinkedList;
import java.util.Queue;
public class _1541_잃어버린괄호 {
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
char[] chars = in.readLine().toCharArray();
Deque<Integer> numbers = new ArrayDeque<>();
Queue<Character> signs = new LinkedList<>();
int idx = 0;
StringBuilder sb = new StringBuilder();
for(int i = 0; i<chars.length;++i) {
if(chars[i] >= '0' && chars[i]<='9') { //숫자일 때
sb.append(chars[i]);
}else { //기호일 때
numbers.add(Integer.parseInt(sb.toString()));
sb.setLength(0);
signs.add(chars[i]);
}
}
numbers.add(Integer.parseInt(sb.toString())); //마지막 수 넣기
numbers.add(numbers.pop()); //맨 앞에 있는 수 맨 뒤로 보내기
while(!signs.isEmpty()) { // + 먼저 연산
char sign = signs.poll();
if(sign == '+') {
int num1 = numbers.pollFirst();
int num2 = numbers.pollLast();
numbers.add(num1+num2);
}else {
numbers.add(numbers.pop()); //맨 앞에 있는 수 맨 뒤로 보내기
}
}
int answer = numbers.pop();
while(!numbers.isEmpty()) { //남은 - 연산
answer -= numbers.pop();
}
System.out.println(answer);
}
}
반응형
'알고리즘 문제풀이 > 백준' 카테고리의 다른 글
Baekjoon_17141_연구소2 (0) | 2020.12.17 |
---|---|
Baekjoon_1946_신입사원 (0) | 2020.12.16 |
Baekjoon_2217_로프 (0) | 2020.12.15 |
Baekjoon_1074_Z (0) | 2020.12.14 |
Baekjoon_20303_할로윈의 양아치 (0) | 2020.12.10 |