sm 기술 블로그
149. 1541(잃어버린 괄호) - 자바 본문
import java.util.*;
import java.io.*;
class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String N = br.readLine();
int result = 0;
N = N.replace("-", " ");
String[] sbits = N.split(" ");
for (int i = 0; i < sbits.length; i++) {
if (sbits[i].indexOf("+") != -1) {
String tmp = sbits[i].replace("+", " ");
String[] plusList = tmp.split(" ");
int plusSum = 0;
for (int j = 0; j < plusList.length; j++) {
plusSum += Integer.parseInt(plusList[j]);
}
sbits[i] = Integer.toString(plusSum);
}
}
if (sbits.length > 1) {
result = Integer.parseInt(sbits[0]);
for (int i = 1; i < sbits.length; i++) {
result -= Integer.parseInt(sbits[i]);
}
}
else {
result = Integer.parseInt(sbits[0]);
}
System.out.println(result);
}
}
문제요약
괄호를 제외하고 +와 -만 가진 연산자가 있다. 적절히 먼저 계산해야할 곳을 찾아 이를 최소로 만들 수 있게 해라.
설명
계산을 무조건 +연산자 부터 실행하면 최소로 만들 수 있다.
다음과 같다고 볼 수 있다.
N = N.replace("-", " ");
String[] sbits = N.split(" ");
먼저 -연산자를 공백으로 바꿔준다.
+연산자부터 계산을 하기 위함이다.
만약 입력이 위에처럼 55-50+40이 들어온다면 sbits에는 ["55", "50+40"] 이 들어간다.
+연산
for (int i = 0; i < sbits.length; i++) {
if (sbits[i].indexOf("+") != -1) {
String tmp = sbits[i].replace("+", " ");
String[] plusList = tmp.split(" ");
int plusSum = 0;
for (int j = 0; j < plusList.length; j++) {
plusSum += Integer.parseInt(plusList[j]);
}
sbits[i] = Integer.toString(plusSum);
}
}
1. +연산이 있는지 확인
if (sbits[i].indexOf("+") != -1)
sbits 각 값들이 +를 가지고 있는지 확인한다.
["55", "50+40"]에서 55는 +연산이 없어 -1로 if문 조건을 만족하지 못한다.
50+40은 -1이 아니기 때문에 조건을 만족한다.
2. +연산이 있는 부분 계산준비
String tmp = sbits[i].replace("+", " ");
String[] plusList = tmp.split(" ");
int plusSum = 0;
+연산을 공백으로 바꾸고 공백을 기준으로 쪼개서 pluslist에 저장한다.
plusSum은 계산된 값을 저장하기 위해 0으로 초기화 해 주었다.
50+40은 50 40 으로 바뀌고 plusList에 ["50","40"] 으로 저장된다.
3. +연산이 있는 부분 계산
for (int j = 0; j < plusList.length; j++) {
plusSum += Integer.parseInt(plusList[j]);
}
sbits[i] = Integer.toString(plusSum);
plusList에 있는 값을 전부 더 해주고 나온 값을 문자열로 변환하여 sbits[i] 자리에 다시 집어 넣는다.
["50","40"] 을 Integer형으로 변환하여 계산하고 나온 결과값 90을 다시 문자열로 변환해서 sbits[i]에 넣는다.
따라서 sbits는 ["55", "90"] 이라는 값을 가지게 된다.
-연산
if (sbits.length > 1) {
result = Integer.parseInt(sbits[0]);
for (int i = 1; i < sbits.length; i++) {
result -= Integer.parseInt(sbits[i]);
}
}
else {
result = Integer.parseInt(sbits[0]);
}
sbits안에 값이 하나밖에 없다면 -연산자가 없다는 것이다.
따라서 그 값이 정답이 되고 그 값을 result에 저장한다.
그렇지 않다면, -연산자를 지녔다는 것이다.
0번째 값을 result에 저장하고 뒤에 있는 값을 순차적으로 빼준다.
["55", "90"]에서 result에 먼저 55가 저장된다.
그후 55 - 90로 인해 답은 -35가 된다.
'문제 > 백준_자바' 카테고리의 다른 글
151. 10828(스택) - 자바 (0) | 2022.07.20 |
---|---|
150. 13305(주유소) - 자바 (0) | 2022.07.19 |
148. 11399(ATM) - 자바 (0) | 2022.07.18 |
147. 1931(회의실 배정) - 자바 (0) | 2022.07.17 |
146. 11047(동전 0) - 자바 (0) | 2022.07.17 |