[ 백준 ] 1541 잃어버린 괄호

codesver·2022년 12월 14일
0

Baekjoon

목록 보기
8/72
post-thumbnail

Analyze

모든 식들은 다음과 같이 있을 때 최소가 된다.

(더하기로 이루어진 식) - (더하기로 이루어진 식) - (더하기로 이루어진 식) ...

이를 만들기 위해서는 주어진 식을 문자 -을 기준으로 분리하면 된다.

이때 첫번째로 분리된 식은 앞에 -가 없기 때문에 더해야 한다.

이후의 (더하기로 이루어진 식) 들은 감산하면 된다.

Performance

Solution은 여러 방법으로 구현할 수 있다.

첫번째 방법은 Stream을 사용하지 않는 것이다. (136ms)

두번째 방법은 Stream을 사용하는 것이다. (136ms)

세번째 방법은 Stream을 섞어서 사용하는 것이다. (128ms)

Stream은 코드를 간단하게 하지만 성능적으로 고민을 해봐야 한다.

Stream을 적절하게 사용하요 코드의 간결성과 성능을 모두 챙겨야 한다.

Solution

  1. No Stream
private static void solution() throws IOException {
    StringTokenizer minus = new StringTokenizer(reader.readLine(), "-");
    StringTokenizer plus = new StringTokenizer(minus.nextToken(), "+");
    int sum = 0;
    while (plus.hasMoreTokens()) sum += Integer.parseInt(plus.nextToken());
    while (minus.hasMoreTokens()) {
        plus = new StringTokenizer(minus.nextToken(), "+");
        while (plus.hasMoreTokens()) sum -= Integer.parseInt(plus.nextToken());
    }
    result.append(sum);
}
  1. Only Stream
private static void solution() throws IOException {
    String[] pluses = reader.readLine().split("-");
    int sum = Arrays.stream(pluses[0].split("\\+")).mapToInt(Integer::parseInt).sum();
    for (int i = 1; i < pluses.length; i++)
        sum -= Arrays.stream(pluses[i].split("\\+")).mapToInt(Integer::parseInt).sum();
    result.append(sum);
}
  1. Mixed
private static void solution() throws IOException {
    StringTokenizer tokenizer = new StringTokenizer(reader.readLine(), "-");
    int sum = summation(tokenizer);
    while (tokenizer.hasMoreTokens()) sum -= summation(tokenizer);
    result.append(sum);
}

private static int summation(StringTokenizer tokenizer) {
    return Arrays.stream(tokenizer.nextToken().split("\\+"))
            .mapToInt(Integer::parseInt)
            .sum();
}
profile
Hello, Devs!

0개의 댓글