Vienna

백준5613번) 계산기 프로그램 본문

알고리즘 문제 풀이

백준5613번) 계산기 프로그램

아는개발자 2023. 5. 24. 15:28

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

 

5613번: 계산기 프로그램

입력의 각 줄에는 숫자와 +, -, *, /, =중 하나가 교대로 주어진다. 첫 번째 줄은 수이다. 연산자의 우선 순위는 생각하지 않으며, 입력 순서대로 계산을 하고, =가 주어지면, 그때까지의 결과를 출

www.acmicpc.net

문제

덧셈, 뺄셈, 곱셈, 나눗셈을 할 수 있는 계산기 프로그램을 만드시오.

입력

입력의 각 줄에는 숫자와 +, -, *, /, =중 하나가 교대로 주어진다. 첫 번째 줄은 수이다. 연산자의 우선 순위는 생각하지 않으며, 입력 순서대로 계산을 하고, =가 주어지면, 그때까지의 결과를 출력한다. 주어지는 수는 108 이하의 양의 정수이다. 계산 중 결과는 0 또는 음수가 될 수 있지만, -108 ~ 108 범위를 넘지는 않는다. 또, 나눗셈에서 소수점은 버린다. 따라서, 100/3*3 = 99이다.

피제수가 음수일 때 나눗셈을 하는 경우는 입력으로 주어지지 않는다.

출력

첫째 줄에 계산 결과를 출력한다.


◆ 풀이

연산자 우선순위를 미리 고려하지 않아도 되는 문제다.

전체 String이 먼저 주어지는 것도 아니기 때문에 정규표현식 등으로 split이 필요하지 않다.

그때그때 연산자를 받고, 기존의 결과와 피연산자를 계산하면 될 것으로 예상된다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

    private static int _result;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        _result = Integer.parseInt(br.readLine());
        while(true){
            String operator = br.readLine();
            if(isEnd(operator))
                break;

            cal(operator, Integer.parseInt(br.readLine()));
        }
        System.out.println(_result);
    }

    private static boolean isEnd(String oper){
        return "=".equals(oper);
    }

    private static void cal(String oper, int value){
        switch (oper){
            case "+":
                add(value);
                break;
            case "-":
                sub(value);
                break;
            case "*":
                mul(value);
                break;
            case "/":
                div(value);
                break;
        }
    }

    private static void add(int val){
        _result +=val;
    }

    private static void sub(int val){
        _result -=val;
    }

    private static void mul(int val){
        _result *=val;
    }

    private static void div(int val){
        _result /=val;
    }
}

본래는 연산자 데이터를 미리 static으로 선언하고 코드 풀이를 할까, 싶었는데 결국 switch문을 도는 것은 크게 다를바 없어보여 그냥 다이렉트로 switch문을 돌기로 했다.

Comments