Algorithm/Baekjoon

백준 / 1247번 / 부호 (+ BigInteger 사용법)

Gyuri 2022. 8. 5. 15:56

[문제]

N개의 정수가 주어지면, 이 정수들의 합 S의 부호를 구하는 프로그램을 작성하시오.

[입력]

총 3개의 테스트 셋이 주어진다. 각 테스트 셋의 첫째 줄에는 N(1 ≤ N ≤ 100,000)이 주어지고, 둘째 줄부터 N개의 줄에 걸쳐 각 정수가 주어진다. 주어지는 정수의 절댓값은 9223372036854775807보다 작거나 같다.

[출력]

총 3개의 줄에 걸쳐 각 테스트 셋에 대해 N개의 정수들의 합 S의 부호를 출력한다. S=0이면 "0"을, S>0이면 "+"를, S<0이면 "-"를 출력하면 된다.

[예제 입력]

3
0
0
0
10
1
2
4
8
16
32
64
128
256
-512
6
9223372036854775807
9223372036854775806
9223372036854775805
-9223372036854775807
-9223372036854775806
-9223372036854775804

[예제 출력]

0
-
+

 

import java.math.BigInteger;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < 3; i++) {
            int n = sc.nextInt();
            
            BigInteger sum = new BigInteger("0");

            for (int j = 0; j < n; j++) {
                sum = sum.add(sc.nextBigInteger());
            }

            if(sum.compareTo(BigInteger.ZERO) == 0) {
                sb.append("0").append('\n');
            }
            else if(sum.compareTo(BigInteger.ZERO) == -1) {
                sb.append("-").append('\n');
            }
            else {
                sb.append("+").append('\n');
            }
        }
        System.out.print(sb);
    }
}

 

간단한 문제라고 생각했는데, 나한테 꽤 까다롭게(?) 느껴지는 문제였다.

 

첫째로, 자료형을 어떻게 설정해야 될 지가 고민이었고

BigInteger를 써본 적이 많지 않아,

어떻게 음수/양수/0 인지 구별해낼 지가 두번째 고민이었다.

 

해당 문제의 코드는 위와 같고,

자료형과 BigInteger에 대한 자세한 설명은 아래에 작성해두었다.

어떤 자료형을 써야할 지 헷갈렸거나, BigInteger 사용법이 익숙치 않다면 참고하면 좋을 거시다.

 


 

참고) 자료형

자료형 범위 크기(byte / bit) 기본값
boolean true, false 1 / 8 false
char 0~65,535(유니코드문자) 2 / 16 ‘\u0000’
byte -128 ~ 127 1 / 8 0
short -32,768 ~ 32,767 2 / 16 0
int -2,147,483,648 ~ 2,147,483,647 4 / 32 0
long -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 8 / 64 0L
float ±1.4E-45 ~ 3.4E38 4 / 32 0.0f
double ±4.9E-324 ~ 1.8E308 8 / 64 0.0 또는 0.0d

 

해당 문제의 입력값 범위 : -9223372036854775807 ~ 9223372036854775807

 

int형은 -2,147,483,648 ~ 2,147,483,647,

long은 -9223372036854775807 ~ 9223372036854775807 으로,

범위를 넘어서면 모두 -으로 출력된다.

 

이 문제에서 사용하려는 BigInteger 자료형은,

문자열 형태로 이뤄져있어 숫자의 범위가 무한해 어떤 숫자든지 담을 수 있다.

 

BigInteger은 java.math안에 있고, 아래와 같이 사용하면 된다. 

 

BigInteger 사용법

BigInteger bigNumber = new BigInteger("10000");

BigInteger을 초기화하기 위해서는, 

문자열을 인자값으로 넘겨줘야 한다 (new BigInteger("10000")

 

BigInteger 계산

BigInteger bigNumber1 = new BigInteger("100000");
BigInteger bigNumber2 = new BigInteger("10000");
		
System.out.println("덧셈(+) :" +bigNumber1.add(bigNumber2));
System.out.println("뺄셈(-) :" +bigNumber1.subtract(bigNumber2));
System.out.println("곱셈(*) :" +bigNumber1.multiply(bigNumber2));
System.out.println("나눗셈(/) :" +bigNumber1.divide(bigNumber2));
System.out.println("나머지(%) :" +bigNumber1.remainder(bigNumber2));

BigInteger 계산은 위와 같이 한다.

 

BigInteger 형 변환

BigInteger bigNumber = BigInteger.valueOf(100000); //int -> BigIntger

int int_bigNum = bigNumber.intValue(); //BigIntger -> int
long long_bigNum = bigNumber.longValue(); //BigIntger -> long
float float_bigNum = bigNumber.floatValue(); //BigIntger -> float
double double_bigNum = bigNumber.doubleValue(); //BigIntger -> double
String String_bigNum = bigNumber.toString(); //BigIntger -> String

 

BigInteger 두 수 비교

∵ 해당 문제에서 사용한 비교방법이다.

BigInteger big1 = new BigInteger("100000000000000000000000000000000000000000000000000000000");
BigInteger big2 = new BigInteger("1000000000000000000000000000000000000000000");

  if (big1.compareTo(big2) == 0)
    System.out.println("동일합니다.");
    
  else if (big1.compareTo(big2) == -1)
    System.out.println("파라미터보다 작은 수입니다.");
    
  else if (big1.compareTo(big2) == 1)
    System.out.println("파라미터보다 큰 수입니다.");

compareTo 메소드를 사용해, 두 수를 비교할 수 있다.

 

0 = 동일함

-1 = big1이 더 작음

1 = big1이 더 큼

'Algorithm > Baekjoon' 카테고리의 다른 글

백준 / 2566번 / 최댓값  (0) 2022.08.05
백준 / 10773번 / 제로  (0) 2022.08.05
백준 / 2420번 / 사파리월드  (0) 2022.07.21
백준 / 1453번 / 피시방 알바  (0) 2022.07.16
백준 / 11650번 / 좌표 정렬하기  (0) 2022.07.16