베오
DCode
베오
전체 방문자
오늘
어제
  • 분류 전체보기 (218)
    • 공지사항 (1)
    • 잡설 (1)
    • Programming (33)
      • [C] (1)
      • [Java] (4)
      • [Python] (2)
      • [Android] (2)
      • [Network] (0)
      • [Operation System] (2)
      • [Spring Boot] (22)
      • [Docker] (0)
    • Algorithm (31)
      • 자료구조 (2)
      • 알고리즘 (Java) (14)
      • 알고리즘 (기초) (15)
    • Coding Test (131)
      • BOJ (131)
      • Algospat (0)
    • 이론적인거 (14)
      • 보안 (5)
      • 오류 해결 (2)
      • 디자인 패턴 (5)
      • 네트워크 (1)
      • 기타 (1)
    • 최신기술 (4)
      • 블록체인 (1)
    • [Project] (1)

블로그 메뉴

  • 🐈‍⬛ GitHub
  • 📫 방명록
  • 🔖 태그

공지사항

인기 글

티스토리

hELLO · Designed By 정상우.
베오

DCode

Coding Test/BOJ

[BOJ/JAVA] 1541번: 잃어버린 괄호

2022. 10. 24. 21:23

1541번: 잃어버린 괄호

 

1541번: 잃어버린 괄호

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

www.acmicpc.net

키워드

그리고 나서 세준이는 괄호를 적절히 쳐서 이 식의 값을 최소로 만들려고 한다.


구현

괄호를 적절히 친다는 것, 언제 최소가 되는지 확인해야 한다.

일단 -를 만나면 그 앞부터 -를 만나거나 끝날 때 까지 +연산을 계속 한뒤, 앞의 수와 -연산을 한다.

예를 들어 1-2+3+4-7 가 있다면 1 뒤에 - 를 만났으므로, 괄호 연산을 하여 -를 만나기 전 까지 즉 (2+3+4) 연산을 한 뒤 앞의 수(1)와 -연산을 한다.

숫자와 식을 분리할 필요가 있어, 각각을 큐에 담아 처리했다.


코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Deque;

public class java_1541 {
    static String mathExpression;

    static Deque<Integer> operand;
    static Deque<Character> operator;

    static int subCalc() {
        int result = operand.poll();

        // -를 만나거나 끝까지 계산하기
        while (!operand.isEmpty()) {
            // + 인 경우
            if (operator.peek() == '+') {
                // 바로 더하기
                operator.poll();
                result += operand.poll();
            }

            // - 인 경우
            else if (operator.peek() == '-') {
                break;
            }
        }

        //
        return result;
    }

    static int calc() {
        // 처음은 무조건 첫 값을 가진다.
        int result = operand.poll();

        // 앞부터 연산을 해 나간다.

        // 만약 -를 만난다면 다음 -를 만나기 전 까지 +연산을 계속 진행하고, 추후에 더한다.
        while (!operand.isEmpty()) {
            // + 인 경우
            if (operator.peek() == '+') {
                // 바로 더하기
                operator.poll();
                result += operand.poll();
            }

            // - 인 경우
            else if (operator.peek() == '-') {
                // 서브루틴 호출
                operator.poll();
                result -= subCalc();
            }
        }

        return result;
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        // 최소로 만들기

        // +만 있으면 상관 없음

        // -가 있는 경우

        // 10+10-20+20
        // -뒤에 +연산이 있으면 (-가 나오기 전 까지, 식의 끝까지)그 사이를 괄호로 묶는다.

        // 1. 입력값, 수식을 분리한다.
        mathExpression = br.readLine();

        operand = new ArrayDeque<>();
        operator = new ArrayDeque<>();

        int nowIndex = 0;
        int startIndex = 0;
        while (true) {
            // 문자열의 끝인 경우
            if (nowIndex == mathExpression.length()) {
                // 마지막 숫자 삽입
                operand.addLast(Integer.parseInt(mathExpression.substring(startIndex, nowIndex)));
                break;
            }

            // 수식을 만난 경우
            if (mathExpression.charAt(nowIndex) == '+' || mathExpression.charAt(nowIndex) == '-') {
                // 이전까지 누적된 숫자 삽입
                operand.addLast(Integer.parseInt(mathExpression.substring(startIndex, nowIndex)));
                startIndex = nowIndex + 1;

                // 수식 삽입
                operator.addLast(mathExpression.charAt(nowIndex));
            }

            nowIndex++;
        }

        // while (!operand.isEmpty()) {
        // System.out.println(operand.poll());
        // }

        // while (!operator.isEmpty()) {
        // System.out.println(operator.poll());
        // }

        // 10+10-20+20
        // -뒤에 +연산이 있으면 (-가 나오기 전 까지, 식의 끝까지)그 사이를 괄호로 묶는다.

        int result = calc();

        System.out.println(result);

    }
}
저작자표시 (새창열림)

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

[BOJ/JAVA] 17471번: 게리맨더링  (0) 2022.11.04
[BOJ/JAVA] 13565번: 침투  (0) 2022.11.04
[BOJ/JAVA] 5582번: 공통 부분 문자열  (0) 2022.10.24
[BOJ/JAVA] 2607번: 비슷한 단어  (0) 2022.10.24
[BOJ/JAVA] 10800번: 컬러볼  (0) 2022.10.19
    'Coding Test/BOJ' 카테고리의 다른 글
    • [BOJ/JAVA] 17471번: 게리맨더링
    • [BOJ/JAVA] 13565번: 침투
    • [BOJ/JAVA] 5582번: 공통 부분 문자열
    • [BOJ/JAVA] 2607번: 비슷한 단어
    베오
    베오

    티스토리툴바