Post

(Algorithm)백준1541번_잃어버린 괄호

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

문제 링크

예제

1번 예제

  • 입력: 55-50+40
  • 출력: -35
  • 55-(50+40) 과 같이 괄호를 쳐주면 예제에서 주어지는 식의 값을 최소로 만들 수 있다.

2번 예제

  • 입력: 10+20+30+40
  • 출력: 100
  • - 연산자가 존재하지 않아, 있는 그대로 식을 계산하면 된다.

풀이

접근 방법

  • 중요 키워드: 이 식의 값을 최소로 만들려고 한다.
  • 값을 최소로 만들기 위해서는 어떻게 해야하는지만 생각할 수 있으면 쉽게 문제를 해결할 수 있다.
  • 값을 최소로 만들기 위해서는 가장 큰 수를 빼주면 된다. 덧셈 부분을 먼저 계산한 후에 빼주면 끝.

풀이 순서

  1. 뺄셈 연산자를 기준으로 문자열을 분리해준다.
  2. 분리된 문자열에 있는 수를 전부 더해준다..
  3. 더해준 값을 뺄셈한다.

코드

입, 출력

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Bjo1541 {
    public static void main(String[] args) throws IOException {
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(System.out));
    
        String equation = bufferedReader.readLine();
    
        Bjo1541 bjo1541 = new Bjo1541();
        int result = bjo1541.solution(equation);
    
        bufferedReader.close();
    
        bufferedWriter.write(result + "\n");
        bufferedWriter.flush();
        bufferedWriter.close();
    }
}

로직

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class Bjo1541 {
    public int solution(String equation) {
        int answer;
        // 문자열을 밸셈 연산자를 기준으로 분리
        String[] token = equation.split("-");
        int[] sums = new int[token.length];
    
        for (int i = 0; i < token.length; i++) {
            int sum = 0;
            // 분리된 문자열에 있는 수를 전부 덧셈
            for (int j = 0; j < token[i].split("\\+").length; j++) {
                sum += Integer.parseInt(token[i].split("\\+")[j]);
            }
            sums[i] = sum;
        }
        // 첫번째 값이 음수가 되는 문제를 막기위해 첫번째 index 값을 answer로 설정
        answer = sums[0];
        // 덧셈한 값을 뺄셈
        for (int i = 1; i < sums.length; i++) {
            answer -= sums[i];
        }
        return answer;
    }
}
  • + 연산자로 문자열을 분리할때 그냥 "+" 하면 regex.PatternSyntaxException 이 발생한다. + 문자를 이스케이프 처리해줘야 의도한 대로 문자열을 분리 할 수 있다.
  • answer = sums[0] 에서 answersums0번째 index 에 있는 값으로 두지 않고, for 반복문에서 sums 0번째 index 부터 모든 값을 뺄셈하는 경우 첫 번째가 음수가 되어 정상적으로 문제 해결이 되지 않는다. 이 문제에서 이 부분이 가능 큰 함정이라 생각했다.
    • 문제에서 가장 처음과 마지막 문자는 숫자이다. == 첫번째 수는 무조건 양수이다.

예제 테스트

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Bjo1541Test {

    static Stream<Arguments> example() {
        return Stream.of(
                Arguments.of("55-50+40", -35),
                Arguments.of("10+20+30+40", 100),
                Arguments.of("00009-00009", 0)
        );
    }

    @MethodSource("example")
    @ParameterizedTest(name = "[{index}] expected: {0} => actual: {1}")
    void test(String input, int expected) {
        Bjo1541 bjo1541 = new Bjo1541();
        int actual = bjo1541.solution(input);

        assertThat(actual).isEqualTo(expected);
    }
}
  • assertj 를 사용한 테스트 코드를 통해 주어진 예제에 대해 정상적으로 풀이가 되고 있는지 확인

  • 예제가 여러개 있는 경우 ParameterizedTest 를 사용하면 편리하다.


REFERENCE


#백준_1541 #백준_잃어버린_괄호

This post is licensed under CC BY 4.0 by the author.