[문제]
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 |