입력되는 수가 2^63보다 작은 자연수이면, 최대가 2^63 자리수인데.. 너무 큰 수라서 유클리드호제법으로도 가능할지 모르겠다.
입력받은수중 하나가 2^63일 경우, 유클리드 호제법을 정말 gcd(10^(2^63-1)+1 % B)로 해야할지.. 조금 막막해서 찾아봤다.
주어진 예제를 바탕으로 규칙을 찾을 수 있다.
-> 막막하면 이렇게 예제를 통해 규칙을 찾을 수 있어야하나? 생각도 못한 접근이다.
A,B의 길이 입력받기
euclid(A,B);
1을 gcd의 자릿수만큼 출력
euclid(A,B) {
if(A<B) {
swap연산 수행
}
int result = A%B
if(result == 0) gcd = B;
else euclid(B,result);
}
public class gcd43 {
static long gcd;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
long aLength = Integer.parseInt(st.nextToken());
long bLength = Integer.parseInt(st.nextToken());
euclid(aLength,bLength);
for(long i=0; i<gcd; i++) {
bw.write("1");
}
bw.flush();
bw.close();
}
public static void euclid(long aLength,long bLength) {
if(aLength<bLength) {
long temp = aLength;
aLength = bLength;
bLength = temp;
}
long result = aLength%bLength;
if(result == 0) gcd = bLength;
else euclid(bLength,result);
}
}
처음에 입력을 int타입으로 받았어서 에러가났다. long으로 변경하면서 입력타입 변환하는 메서드도 수정하는걸 놓쳤다.
범위를 초과하기때문에 모든 입력과 result, gcd 등 변수의 타입을 long으로 변경했으므로, Integer.parseInt
->Long.parseLong
으로 수정
어려운건 아니었고, 숫자입력은 처음부터 보통 long으로 입력받도록 습관들이는게 좋다!!
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.StringTokenizer;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
public class Main {
static long gcd;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
long aLength = Long.parseLong(st.nextToken());
long bLength = Long.parseLong(st.nextToken());
euclid(aLength,bLength);
for(long i=0; i<gcd; i++) {
bw.write("1");
}
bw.flush();
bw.close();
}
public static void euclid(long aLength,long bLength) {
if(aLength<bLength) {
long temp = aLength;
aLength = bLength;
bLength = temp;
}
long result = aLength%bLength;
if(result == 0) gcd = bLength;
else euclid(bLength,result);
}
}
풀이를 어느정도 미리보고 진행했기때문에 틀리진않았지만, 내가 혼자했다면 BufferedWriter를 사용하지않아서 시간초과가 났을것이다.
처음부터 BufferedWriter를 사용하도록 습관을 들이자!
아니면, 출력의 범위가 클 경우 BufferedWriter를 사용하도록 주의하자!