```
백준 2338번 큰 수, 덧셈, 뺄셈, 곱셈 JAVA 구현해보기
```

이번 글을 통해 배워갈 내용
- 백준 2338번 풀이
- 자바 BufferReader 간단 설명
- 자바 BigInteger 간단 설명
https://www.acmicpc.net/problem/2338
2338번: 긴자리 계산
첫째 줄에 A+B, 둘째 줄에 A-B, 셋째 줄에 A×B를 출력한다. 각각을 출력할 때, 답이 0인 경우를 제외하고는 0으로 시작하게 해서는 안 된다(1을 01로 출력하면 안 된다는 의미).
www.acmicpc.net
백준 2338번 긴자리 계산은
난이도 브론즈 문제로서
1000자리를 넘지 않는 두 수 A, B를 입력받아서
A+B, A-B, AxB를 출력하면 되는 문제입니다.
30분 정도 위에 링크를 방문하셔서 풀어보시고
안 풀리시는 경우에만 아래 해답을 봐주시면 감사하겠습니다.
일단 입력을 받기 위해서
BufferedReader를 사용하였습니다.
BufferedReader는 문자(Character)들을 임시 주머니(Buffer)에 넣어서
텍스트 데이터를 효율적으로 읽어오게 도와주는 클래스입니다.
다시 쉽게 풀어서 설명하면
BufferedReader는 여러 문자열들을 버퍼에 임시 저장해서 입출력하는데 드는 횟수를 줄여서 속도를 빠르게 해 줍니다.
import 해주고
import java.io.*;
객체 선언 및 생성하고
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
한 줄씩 입력받아서 사용하였습니다.
br.readLine()
사용 후에는
스트림을 종료하고 자원을 반납했습니다.
br.close();
문자열 값이 아니고
숫자가 필요한 경우 Buffer Reader로 읽은 뒤
StringTokenizer로 숫자 변환 후 사용을 많이 하는 편입니다.
import java.util.StringTokenizer;
st = new StringTokenizer(br.readLine(), " ");
int Num1 = Integer.parseInt(st.nextToken());
추가로 설명하자면 IO 문제가 날 수 있기 때문에 아래와 같은 예외처리를 추가해줘야 합니다.
throws IOException
Buffer Writer는 Buffer Reader와 방식이 거의 유사하기 때문에 설명을 간략하게 하자면
Buffer Writer는 문자(Character)들을 임시 주머니(Buffer)에 넣어서
텍스트 데이터를 효율적으로 쓰게 도와주는 클래스입니다.
BigInteger는
4바이트 내에서 표현 가능한 Int나
8바이트 내에서 표현 가능한 Long과 달리
String에 값을 넣어서 계산을 하여
이론상 범위 제한이 거의 없는
방법입니다.
Try Catch 문을 안 쓰고 작업을 한다면 아래와 같이
문자열 값을 할당하고
add, subtract, multiply 등 내부 메서드를 써주고
출력만 해주면 됩니다.
BigInteger bigNumber1 = new BigInteger(br.readLine());
BigInteger bigNumber2 = new BigInteger(br.readLine());
BigInteger bigNumSum = bigNumber1.add(bigNumber2);
BigInteger bigNumSub = bigNumber1.subtract(bigNumber2);
BigInteger bigNumMul = bigNumber1.multiply(bigNumber2);
bw.write(bigNumSum.toString()+ "\n");
bw.write(bigNumSub.toString()+ "\n");
bw.write(bigNumMul.toString()+ "\n");
전체 코드는 아래와 같습니다.
import java.io.*;
import java.math.BigInteger;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
BigInteger bigNumber1;
BigInteger bigNumber2;
try{
bigNumber1 = new BigInteger(br.readLine());
bigNumber2 = new BigInteger(br.readLine());
}catch (Exception e){
e.printStackTrace();
throw e;
}
BigInteger bigNumSum = bigNumber1.add(bigNumber2);
BigInteger bigNumSub = bigNumber1.subtract(bigNumber2);
BigInteger bigNumMul = bigNumber1.multiply(bigNumber2);
bw.write(bigNumSum.toString()+ "\n");
bw.write(bigNumSub.toString()+ "\n");
bw.write(bigNumMul.toString()+ "\n");
bw.flush();
bw.close();
br.close();
}
}
만약 Big Integer를 안 쓰고 푸신다면
곱셈을 예로 들자면
O(n^2)으로 단순하게 반복해서
한 자리씩 곱하는 방법이 있고
Karatsuba(카라 추바) 알고리즘을 사용해서
곱셈 O(n^(log(2) 3))으로 푸는 방법이 있고
(자세한 방법은 여기를 참조하시면 됩니다)
카라추바 알고리즘 - 위키백과, 우리 모두의 백과사전
카라추바 알고리즘은 소련의 수학자 아나톨리 알렉세예비치 카라추바가 1960년에 발견하고 1962년에 공개한, 큰 수에 대한 효과적인 곱셈 알고리즘이다. [1][2][3] 이 방법은 두 n자리 수의 곱셈을
ko.wikipedia.org
혹은
Schönhage–Strassen 알고리즘을 사용해서
O(nlognloglogn)의 방법으로 푸실 수도 있습니다.
(자세한 방법은 여기를 참조하시면 됩니다)
https://en.wikipedia.org/wiki/Sch%C3%B6nhage%E2%80%93Strassen_algorithm
Schönhage–Strassen algorithm - Wikipedia
Multiplication algorithm The Schönhage–Strassen algorithm is based on the Fast Fourier transform (FFT) method of integer multiplication. This figure demonstrates multiplying 1234 × 5678 = 7006652 using the simple FFT method. Number-theoretic transforms
en.wikipedia.org
그리고 마지막으로
스위스 수학자 마르틴 퓌러가 발표한
빠른 푸리에 변환을 사용한 방법도 있습니다.
O(nlogn * (2^O(log*n)))
https://ko.wikipedia.org/wiki/%ED%93%8C%EB%9F%AC_%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98
퓌러 알고리즘 - 위키백과, 우리 모두의 백과사전
ko.wikipedia.org
읽어주셔서 감사합니다
무엇인가 얻어가셨기를 바라며
오늘도 즐거운 코딩 하시길 바랍니다 ~ :)
'Java > Java 알고리즘' 카테고리의 다른 글
| 백준 16435번 스네이크버드 JAVA 구현해보기 (0) | 2021.12.01 |
|---|---|
| 백준 3054번 피터팬 프레임 JAVA 구현해보기 (0) | 2021.11.28 |
| 백준 20299번 3대측정 JAVA 구현해보기 (0) | 2021.11.20 |
| 백준 20361번 일우는야바위꾼 JAVA 구현해보기 (1) | 2021.11.20 |
| 백준 1063번 킹 JAVA 구현해보기 (0) | 2021.11.14 |