1541번: 잃어버린 괄호
첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다
www.acmicpc.net
💡풀이💡
식이 주어졌을 때 최소의 값을 만들기
>> 가장 작은 수 - 가장 큰 수 를 만들면 되지 않을까??? 하는 생각으로 접근
식에 여러 숫자와 여러 연산자가 있겠지만 가장 간단한 형태로 생각해보면 마이너스 연산자(-)를 기준으로 가장 작은 수와 가장 큰 수가 나뉘게 된다.
- 마이너스 연산자 + 1만큼의 수의 덩어리가 생기게 됨
마이너스가 나오기 전까지 앞의 숫자들을 모두 계산해서 하나의 수 덩어리를 만들고 마이너스가 나온 이후의 숫자들을 모두 더해 또 다른 하나의 수 덩어리를 만듦
- 마이너스 앞에 만들어지는 덩어리가 가장 작은 수
- 마이너스 뒤에 만들어지는 덩어리가 가장 큰 수가 됨
각 덩어리를 앞에서부터 차례대로 빼면 최종적으로 식에서 만들 수 있는 가장 최소의 값을 찾을 수 있음
1. 만들 수 있는 수 덩어리 개수
마이너스를 기준으로 왼쪽과 오른쪽으로 수가 나눠지기 때문에 식에서 마이너스 연산자를 찾아 마이너스 연산자의 개수 + 1만큼 배열을 생성한다.
- sum 배열에 만들어지는 각 수의 덩어리의 합을 저장
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
int minusCnt = 0; // 마이너스 연산자 수 카운팅
for(int i=0; i<str.length(); i++) {
if(str.charAt(i)=='-') minusCnt++;
}
int[] sum = new int[minusCnt+1]; // 마이너스 연산자 수 +1 만큼 배열 생성
2. 수 덩어리 별로 합 구하기
문자열을 한 character씩 잘라서 확인
- 숫자이면
- 0일 경우 :: 문자열의 길이가 0이 아니면 문자열에 더하기 >> 0이 뒤에 나올 때만 숫자로 생각
- 0이 아닐 경우 :: 문자열에 더해 숫자 만들기
- 연산자이면
- 현재 덩어리 합에 지금 숫자 더하기
- 숫자 만드는 문자열 초기화
- 연산자가 마이너스(-)이면 다음 덩어리로 index 증가
int index=0; // 현재 덩어리의 index
String num="";
for(int i=0; i<str.length(); i++) {
char ch = str.charAt(i);
if(ch !='-' && ch !='+') { // 숫자일 때
if(ch=='0') {
if(num.length()!=0) num += ch; // 0이 앞이 아닐 때만 추가
}
else {
num += ch;
}
}
else { // 연산자 일 때
sum[index] += Integer.parseInt(num); // 현재 덩어리 합에 만들어진 숫자 더하기
num = "";
if(ch == '-') index++; // 다음 덩어리로 넘어가기
}
}
sum[index] += Integer.parseInt(num); // 마지막 숫자 더하기
3. 결과 구하기
아직 진행하지 않은 연산은 마이너스 밖에 없기 때문에 배열의 처음부터 끝까지 마이너스 연산 진행
int ans = sum[0];
for(int i=1; i<sum.length; i++) {
ans -= sum[i];
}
전체 코드
package Day_0307;
import java.io.*;
import java.util.*;
public class B1541 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
int minusCnt = 0; // 마이너스 연산자 수 카운팅
for(int i=0; i<str.length(); i++) {
if(str.charAt(i)=='-') minusCnt++;
}
int[] sum = new int[minusCnt+1]; // 마이너스 연산자 수 +1 만큼 배열 생성
int index=0;
String num="";
for(int i=0; i<str.length(); i++) {
char ch = str.charAt(i);
if(ch !='-' && ch !='+') { // 숫자일 때
if(ch=='0') {
if(num.length()!=0) num += ch; // 0이 뒤에 나오는 경우만 숫자 문자열에 추가
}
else {
num += ch;
}
}
else { // 연산자 일 때
sum[index] += Integer.parseInt(num); // 현재 인덱스의 sum배열에 숫자 더하기
num = ""; // 숫자 문자열 초기화 >> 연산자 다음은 무조건 새로운 숫자이기 때문에
if(ch == '-') index++;
}
}
sum[index] += Integer.parseInt(num); // 마지막 숫자 더하기
int ans = sum[0];
for(int i=1; i<sum.length; i++) {
ans -= sum[i];
}
System.out.println(ans);
br.close();
}
}
'알고리즘 문제풀이 > 백준' 카테고리의 다른 글
[백준 11727] 2xn 타일링 2 (0) | 2023.03.28 |
---|---|
[백준 1149] RGB거리 (0) | 2023.03.28 |
[백준 2146] 다리 만들기 (0) | 2023.02.28 |
[백준 17471] 게리 맨더링 (0) | 2023.02.26 |
[백준 1759] 암호 만들기 (0) | 2023.02.24 |
댓글