Don't give up!

[백준] 1541번 : 잃어버린 괄호 (java) 본문

Coding Test/BOJ

[백준] 1541번 : 잃어버린 괄호 (java)

Heang Lee 2021. 8. 17. 16:31

1541번: 잃어버린 괄호 (acmicpc.net)

 

1541번: 잃어버린 괄호

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

www.acmicpc.net

어떻게 생각하고 문제를 풀었는가?

+와 -만으로 이루어진 식에서 최소 값은 - 연산이 나온 이후의 값을 모두 -로 만들었을 때 구할 수 있습니다.

따라서 문자열의 첫 - 연산 위치를 확인하고, 문자열을 나눈 후 각 문자열의 숫자 값을 모두 합하여 첫 문자열로부터 도출한 값 - 나중 문자열로부터 도출한 값으로 문제를 해결할 수 있을 것이라고 생각하였습니다.

코드

import java.io.*;
import java.util.*;

class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String formula = reader.readLine();
        reader.close();

        String[] subformulas = formula.split("-", 2);
        int result = calculate(subformulas[0]);
        if(minusExisted(subformulas)){
            result -= calculate(subformulas[1]);
        }

        System.out.println(result);
    }

    private static int calculate(String formula){
        String[] values = formula.split("\\D");
        return Arrays.stream(values).mapToInt(Integer::parseInt).sum();
    }
    
    private static boolean minusExisted(String[] subformulas){
    	return subformulas.length > 1;
    }
}

String의 split과 정규 표현식을 사용하여 코드를 작성하였습니다.

첫 - 연산을 기점으로 두 개의 문자열을 나누기 위해 split("-", 2)를 호출하여 최대 2개의 문자열로만 나뉘어 질 수 있도록 하였고, 0~9가 아닌 문자열을 의미하는 정규 표현식 \D를 split의 인자로 사용하여 연산을 무시하고 숫자 값들만을 String배열에 저장할 수 있도록 하였습니다.

문제를 해결함에 있어 주의해야할 점은 - 연산이 없는 입력이 존재할 수 있다는 것입니다.

split함수의 결과가 문자열 하나로만 이루어진 배열이므로 배열의 크기가 1보다 크다면 (크기가 2라면) 뺄셈을 해주는 것으로 정상적인 결과를 얻을 수 있습니다.

 

'Coding Test > BOJ' 카테고리의 다른 글

[백준] 10830번 : 행렬 제곱 (java)  (0) 2021.08.18
[백준] 11758번 : CCW (java)  (0) 2021.08.16
[백준] 2166번 : 다각형의 면적 (java)  (0) 2021.08.15