https://www.acmicpc.net/problem/1247
N개의 정수가 주어지면, 이 정수들의 합 S의 부호를 구하는 프로그램을 작성하시오.
시간 제한 메모리 제한 제출 정답 맞힌 사람 정답 비율
2 초 256 MB 15148 4833 4250 36.468%
문제
N개의 정수가 주어지면, 이 정수들의 합 S의 부호를 구하는 프로그램을 작성하시오.
입력
총 3개의 테스트 셋이 주어진다. 각 테스트 셋의 첫째 줄에는 N(1 ≤ N ≤ 100,000)이 주어지고, 둘째 줄부터 N개의 줄에 걸쳐 각 정수가 주어진다. 주어지는 정수의 절댓값은 9223372036854775807보다 작거나 같다.
총 3개의 줄에 걸쳐 각 테스트 셋에 대해 N개의 정수들의 합 S의 부호를 출력한다. S=0이면 "0"을, S>0이면 "+"를, S<0이면 "-"를 출력하면 된다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.math.BigInteger;
import java.util.StringTokenizer;
public class Num1247 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
for (int i = 0; i < 3; i++) {
BigInteger answer = new BigInteger("0");
int N = Integer.parseInt(br.readLine());
for (int j = 0; j < N; j++) {
BigInteger N2 = new BigInteger(br.readLine());
answer = answer.add(N2);
}
if(answer.compareTo(BigInteger.ZERO) == -1){
System.out.println("-");
}else if(answer.compareTo(BigInteger.ZERO) == 1){
System.out.println("+");
}else{
System.out.println(0);
}
}
}
}
이 문제를 풀때, 가장 중요한 부분이라고 생각한다.
해당 테스트셋의 범위에 맞게 Long 또는 BigInteger를 사용해야하기에 두개의 차이점에 대해서 학습하였다.
먼저, BigInteger부터 설명하자면
간단하게 얘기해서 Long보다 큰 수를 표현하기에 적합한 범위를 갖고 있다. 우리가 흔히 아는 사칙연산(+,-,*,/) 을 활용하여 연산을 할 수 없다는 특징이 있으며 메서드를 사용해서 연산해야 한다.
비교
BigInteger bigNumber1 = new BigInteger("100000");
BigInteger bigNumber2 = new BigInteger("1000000");
int compare = bigNumber1.compareTo(bigNumber2);
비교시에는 compareTo를 사용하여 두 수를 비교한다.
BigInteger.ZERO
if(answer.compareTo(BigInteger.ZERO) == -1){
System.out.println("-");
}else if(answer.compareTo(BigInteger.ZERO) == 1){
System.out.println("+");
}else{
System.out.println(0);
}
BigInteger.ZERO는 0을 표현하는 것으로
해당 문제에서 answer이 BigInteger.ZERO보다 크면 "+"
작으면 "-" 을 출력한다.