본문 바로가기
Language/Java

[Java] Type & BigInteger

by SooooooooS 2023. 11. 2.
728x90

한동안 python으로만 코테를 준비했다.

그러나 취업을 준비해보니 Java가 필요하다는 것을 느꼈다.

너무 오랜만에 Java로 문제를 풀다보니 Number format 오류가 발생했다.

그래서 원시 타입을 정리하고 문제 풀이에 사용한 BigInteger를 정리해보려고 한다.

1. Primitive type

원시 타입(Primitive type) 이란?
: 정수, 실수, 문자, 논리 리터럴을 직접 저장하는 타입

 

종류 기본 타입 메모리 사용량 값의 범위
정수 byte 1byte 8bit -2^7 ~ 2^7-1 (-128 ~ 127)
short 2byte 16bit -2^15 ~ 2^15-1 (-32768 ~ 32767)
int 4byte 32bit -2^31 ~ 2^31-1 (-2147483648 ~ 2147483647)
long 8byte 64bit -2^63 ~ 2^63-1
실수 float 4byte 32bit  
double 8byte 64bit  
논리 boolean 1byte 8bit true, false

※ 정수 타입

값의 범위 : -2^(n-1) ~ 2^(n-1)-1
(n : 비트 수)

Q. 양수 부분(2^(n-1)-1)에서 -1이 되는 이유는?

A.  0이 포함되기 때문이다.

 

Q. n-1 제곱을 하는 이유는?

A. 최상위 비트(MSB : Most Significant Bit)가 부호를 결정하는 비트로 사용된다.

(최상위 비트가 0일 경우 양수, 1일 경우 음수)

 

Q. 음수를 표현하는 방법은?

A. 2의 보수법을 사용한다.

정수 저장 방법

1789번 - 수들의 합

입력 범위

이번에 푼 문제의 입력 범위이다.

생각없이 바로 int형 변수를 사용하여 문제를 풀었다.

그러나 범위 오류가 발생했다.

int형이 표현 가능한 값의 범위는

-2,147,483,648 ~2,147,483,647 이다.

 

 

만약에 부호를 표현하지 않는다면 2,147,483,648 + 2,147,483,647 = 4,294,967,295 까지 표현할 수 있겠다고 생각하여

C언어의 unsigned int를 생각했다. 하지만 java에서 기본적으로 제공하지는 않는다. (그러나 사용할 수 있는 방법은 있다.)

그래서 내각 선택한 방법은 2가지이다.

  • long 타입 사용하기
  • BigInteger 사용하기
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));

        long N = Long.parseLong(bf.readLine());
        int result = 1;
        long current = 1;
        long remain = N - 1;
        
        while (current < remain) {
            result++;
            current++;
            remain -= current;
        }
        System.out.println(result);
    }
}

 

long 타입을 사용한 코드이다. BigInteger는 밑에 개념 정리 후 붙여둔다.

※ 실수 타입

부동 소수점(floating-point) 방식
:  (+/-) m * 10^n (0 <= m < 1 : 가수, n : 지수)

example) 1.2345 = 0.12345 * 10^1 → 가수 : 0.12345 / 지수 : 1

실수 저장 방법

java에서는 실수를 기본적으로 double로 간주하기 때문에 float 타입의 변수에 저장하려면 리터럴 뒤에 f나 F를 붙인다.

2. class BigInteger

[공식 문서] https://docs.oracle.com/javase/8/docs/api/java/math/BigInteger.html

  • 문자열 형태로 숫자를 처리한다.
  • -2^Integer.MAX_VALUE ~ +2^Integer.MAX_VALUE 를 지원한다고 한다.

※ 선언

import java.math.BigInteger;

BigInteger N = new BigInteger("4294967295");
  • BigInteger를 초기화하기 위해서는 문자열을 인자로 넘겨주어야 한다!

※  사칙연산

bigNumber1.add(bigNumber2);		//덧셈
bigNumber1.subtract(bigNumber2);	//뺄셈
bigNumber1.multiply(bigNumber2);	//곱셈
bigNumber1.divide(bigNumber2);		//나눗셈
bigNumber1.remainder(bigNumber2);	//나머지
  • class 내부 메소드를 사용하여 사칙연산하기!

※  비교연산

bigNumber1.compareTo(bigNumber2);
  • bigNumber1 == bigNumber2 → return 0
  • bigNumber1 < bigNumber2 → return -1
  • bigNumber1 > bigNumber2 → return 1
  • 문자열 비교와 동일하다.

※  BigInteger 상수

 

BigInteger.ONE
BigInteger.TEN
BigInteger.ZERO

 

 

 

※ 1789번 - BigInteger 풀이

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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));

        BigInteger N = new BigInteger(bf.readLine());
        int result = 1;
        BigInteger current = new BigInteger("1");
        BigInteger remain = N.subtract(current);
        while (current.compareTo(remain) == -1) {
            result++;
            current = current.add(BigInteger.ONE);
            remain = remain.subtract(current);
        }
        System.out.println(result);
    }
}
728x90

'Language > Java' 카테고리의 다른 글

[Java] PreparedStatement 공부하기  (0) 2024.04.28
[Java] MacOS JDK 삭제  (2) 2023.11.27