코딩테스트/programming_JAVA

[Java] baekjoon_1541 : 잃어버린 괄호

prometedor 2024. 2. 13. 15:04

수학, 그리디 알고리즘, 문자열, 파싱

잃어버린 괄호 : Silver2

https://www.acmicpc.net/problem/1541

 

1541번: 잃어버린 괄호

첫째 줄에 식이 주어진다. 식은 ‘0’~‘9’, ‘+’, 그리고 ‘-’만으로 이루어져 있고, 가장 처음과 마지막 문자는 숫자이다. 그리고 연속해서 두 개 이상의 연산자가 나타나지 않고, 5자리보다

www.acmicpc.net

 

 

** 최소값을 구하려면 - 부호가 붙은 수가 커야 한다.
    1. 입력받은 문자열을 - 부호를 기준으로 토큰으로 나눈다.
    2. 분리한 토큰에서 + 부호를 기준으로 분리해서 합산한다.
    3. 첫번째 값에서부터 합산한 값들을 차례대로 빼면 된다.
    4. 첫번째 수에 0이 올수 있기 때문에 sum의 초기값은 0이 아니어야 한다.

 

 

풀이

import java.io.*;

public class Main {
  static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    public static void main(String[] args) throws IOException {        
      int sum = Integer.MAX_VALUE; // 초기 상태 여부 확인을 위한 값으로 설정 
      String[] subNum = br.readLine().split("-");
      
      for (int i = 0; i < subNum.length; i++) {
        int tmp = 0;

        // 뺄셈으로 나뉜 토큰을 덧셈으로 분리하여 해당 토큰들을 더한다.
        String[] addNum = subNum[i].split("\\+");

        // 덧셈으로 나뉜 토큰들을 모두 더한다. 
        for (int j = 0; j < addNum.length; j++) {
          tmp += Integer.parseInt(addNum[j]);
        }

        // 첫 번째토큰인 경우 tmp값이 첫 번째 수가 됨
        if (sum == Integer.MAX_VALUE) {
          sum = tmp;
        } else {
          sum -= tmp;
        }
      }
      bw.write(sum + "\n");
      bw.flush();
      br.close();
      bw.close();
    }
}

 

 

int sum = Integer.MAX_VALUE;

ㄴ 초기 상태 여부를 확인하기 위한 변수로, 최댓값으로 설정한다.

String[] sub = br.readLine().split("-");

ㄴ 입력으로 주어진 식을 "뺄셈"을 기준으로 분리한다.

for (int i = 0; i < sub.length; i++) {

ㄴ 분리된 각 토큰에 대해 반복한다.

int tmp = 0;

ㄴ현재 토큰의 값을 저장할 임시 변수를 초기화한다.

String[] add = sub[i].split("\\+");

ㄴ 현재 토큰을 덧셈을 기준으로 분리한다.

for (int j = 0; j < add.length; j++) {

ㄴ 분리된 각 덧셈 토큰에 대해 반복한다.

tmp += Integer.parseInt(add[j]);

ㄴ 덧셈 토큰을 정수로 변환하여 임시 변수에 더한다.

if (sum == Integer.MAX_VALUE) { 
    sum = tmp; 
} else { 
    sum -= tmp; 
}

ㄴ 현재 토큰을 처리하여 최종 결과 값을 계산한다.

ㄴ 만약 처음 토큰이라면, 임시 변수 값을 최종 결과 값으로 설정하고, 그렇지 않으면 임시 변수 값을 최종 결과 값에서 뺀다.