문제
1541번: 잃어버린 괄호
첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다
www.acmicpc.net
구현 방법
생각보다 간단한 문제였습니다.
연산자가 +, - 밖에 없기 때문에 수를 나열했을 때 -가 나오면 남은 뒤를 싹 -시켜버리면 최솟값이 나옵니다.
예제를 통해 예를 들어보겠습니다.
55-50+40 일 때의 최솟값은 55-(50+40) 일 때 입니다. 이렇게 처음부터 수를 탐색하다 -가 나오면 뒤를 싹 빼줍니다.
수를 탐색해야 하기 때문에 문자열을 숫자로 바꾸어 리스트에 넣어줍니다.
처음 입력된 문자열의 길이만큼 반복문을 돌려서 값을 하나하나 확인해줍니다.
charAt() 함수를 이용하여 한 글자씩 가져오고 Character.isDigit() 함수(숫자라면 true, 아니면 false 리턴)를 이용하여 현재 가져온 값이 숫자인지 확인해줍니다.
만약 숫자라면 카운트를 세줍니다. 그러다 연산자가 나오면 카운트를 멈춰주고 substring을 이용해 현재 위치-cnt부터 현재 위치까지 잘라 리스트에 넣어줍니다.
만약 들어온 값이 연산자 '-' 라면 음수값을 표현해주기 위해 같이 넣어야하므로 카운트를 세줍니다.
이를 반복하여 입력된 문자를 숫자로 만들어 리스트에 넣어줍니다.
리스트를 탐색하면서 -가 나오면 flag = true를 해주어 그 다음 양수값들은 싹 빼줍니다.
하지만 음수값이 나올수도 있으므로 값이 음수일 때의 조건을 추가해줍니다.
구현 코드
package BOJ.Silver;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
public class B1541_잃어버린괄호 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String calc = br.readLine();
int cnt = 0;
List<Integer> num = new ArrayList<>();
int size = calc.length();
for (int i=0;i<size;i++) {
char temp = calc.charAt(i);
if (Character.isDigit(temp)) cnt++; // 숫자라면 cnt++
else { // 연산자가 나오면
num.add(Integer.parseInt(calc.substring(i-cnt, i))); // 현재 위치-cnt부터 현재 위치까지 숫자
cnt = 0;
if (temp=='-') cnt++; // 연산자지만 마이너스 값을 표현하기 위해 넣어줘야함
}
}
if (cnt>0) num.add(Integer.parseInt(calc.substring(size-cnt, size)));
int ans = num.get(0);
boolean flag = false;
for (int i=1;i<num.size();i++) {
if (num.get(i)<0) { // 음수면
flag = true;
ans+=num.get(i); // 음수 더해줌 = 빼줌
}
else if (flag) ans-=num.get(i); // 음수가 아니지만 음수가 한번이라도 나왔으면 빼줌
else ans+=num.get(i); // 음수가 한번도 나오지 않았다면 더해줌
}
System.out.println(ans);
}
}
'백준' 카테고리의 다른 글
백준 17298번 : 오큰수 (0) | 2021.03.06 |
---|---|
백준 1316번 : 그룹 단어 체커 (0) | 2021.03.06 |
백준 1449번 : 수리공 항승 (0) | 2021.03.05 |
백준 14889번 : 스타트와 링크 (0) | 2021.03.05 |
백준 1972번 : 놀라운 문자열 (0) | 2021.03.05 |