백준 28086 자바

손찬호·2024년 5월 13일
0

알고리즘

목록 보기
38/91

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

자바 부호 문자 처리

문자열로 입력된 수식을 split으로 나눌 때
input.split("\/")면 제대로 작동하는데
input.split("/")면 에러가 발생했다. 왜 그런 것일까?

자바의 String.split 메서드는 문자열을 분리할 구분 기호를
정규 표현식으로 받는다.

그래서 "/"가 아니라 "\\/"를 줘야한다.

새로 배운 내용 2

자바의 "/"연산자는 0에 가깝게 내림을 한다.

그래서 두 정수 A,B를 나눈 [A/B]를 계산할 때 문제가 발생했다.
자바의 경우 결과가 양수면 내림을 해주지만
음수면 올림이 되서 결과적으로 -1을 해줘야한다.
예를 들어 5/2는 0쪽으로 내림을 해서 2가 나와야하지만
음수인 경우의 자바는 63/-2=-31.5도 0쪽으로 내림을 해서 -31이 나온다.
하지만 예제 코드는 [63/-2]=-32가 나와야 한다.
따라서 나누기("/")로 하는 경우 결과가 음수인 경우 -1을 해줘야한다.

풀이 아이디어

/,*,+ 순서로 나누고 -는 -10-10처럼 1번째 숫자가 음수인 경우는 따로 해줘야한다.
"/"인 나누기 연산을 하는 경우에는 먼저 2번째 숫자가 0인 경우에는
0으로 나누는 것이므로 "invalid"를 출력하고
나머지가 0이면 그냥 출력하지만 나머지가 0이 아닌 경우 [A/B]이기 때문에
나누는 두 수 A,B에서 A와 B 중 하나만 음수인 경우 0또는 음수가 나오게 된다.
A/B가 나머지는 있으면서 0 또는 음수가 나오는 경우 결과값에 -1을 해주고 출력
A/B가 나머지는 있으면서 0 또는 양수가 나오는 경우 결과값을 그대로 출력한다.

풀이 코드

import java.io.*;

class _28086{
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String input = br.readLine();
        String answer = "";

        if(input.contains("/")){
            String[] arr = input.split("\\/");
            long number1 = Long.valueOf(arr[0],8);
            long number2 = Long.valueOf(arr[1],8);
            
            if(number2==0){
                System.out.println("invalid");
                System.exit(0);
            }
            
            // 나머지 없는 경우
            if(number1%number2==0){
                answer = Long.toString(number1/number2, 8);
            }
            // 나머지가 있는 경우
            else{
                if((number1>0 && number2>0) || (number1<0 && number2<0)){
                    answer = Long.toString(number1/number2, 8);
                }
                else{
                    answer = Long.toString((number1/number2)-1, 8);
            }
            }
        }
        else if(input.contains("*")){
            String[] arr = input.split("\\*");
            long number1 = Long.valueOf(arr[0],8);
            long number2 = Long.valueOf(arr[1],8);
            answer = Long.toString(number1*number2, 8);
        }
        else if(input.contains("+")){
            String[] arr = input.split("\\+");
            long number1 = Long.valueOf(arr[0],8);
            long number2 = Long.valueOf(arr[1],8);
            answer = Long.toString(number1+number2, 8);
        }
        else if(input.contains("-")){
            String[] arr = input.split("\\-");
            long number1 = 0;
            long number2 = 0;

            // 첫 숫자가 음수면 arr[0]==""
            if(arr[0].equals("")){
                arr[1] = "-"+arr[1];
                number1 = Long.valueOf(arr[1],8);
                number2 = Long.valueOf(arr[2],8);
            }
            // 첫 숫자가 양수인 경우
            else{
                number1 = Long.valueOf(arr[0],8);
                number2 = Long.valueOf(arr[1],8);
            }
            answer = Long.toString(number1-number2, 8);
        }
        else{
            System.out.println("error");
        }
        System.out.println(answer);
    }
}
profile
매일 1%씩 성장하려는 주니어 개발자입니다.

0개의 댓글