
문제를 이해하고 있다면 바로 풀이를 보면 됨
전체 코드로 바로 넘어가도 됨
마음대로 번역해서 오역이 있을 수 있음
수정된 Kaprekar number는 특별한 속성을 가진 양의 정수다. 수를 제곱하고, 두 개의 정수로 나누고 그 정수를 합한다면 시작한 값과 같은 값을 갖는다.
d 자리의 양의 정수 n이 주어진다. n을 제곱해서 2 d 또는 2 d - 1의 자리인 숫자를 구한다. l과 r 두 부분으로 나눠서 제곱된 수를 문자열로 나눈다. 오른쪽 부분인 r은 d 자리까지의 길이여야 한다. 왼쪽 부분은 남은 부분 문자열이다. 두 문자열을 정수로 변환하고, 더 했을 때 결과가 n과 같은지 확인해라.
n = 5
d = 1
처음 n^2 = 25를 계산한다. 두 개의 문자로 나누고 정수 2와 5로 되돌린다.
2 + 5 = 7 ≠ 5 이므로 수정된 Kaprekar number가 아니다. 만약 n = 9, d = 1, n^2 = 81이라면 1 + 8 = 9라서 n과 같다.
kaprekarNumbers 함수를 완성해라.
kaprekarNumbers 함수는 아래와 같은 매개변수를 가지고 있다.
공백으로 구분되고 오름차순으로 정렬된 수정된 Kaprekar numbers 리스트를 출력해야한다. 만약 수정된 Kaprekar numbers가 없는 범위가 주어진다면 INVALID RANGE를 출력해라. 반환 값은 필요없다.
문제는 쉽지만 숫자를 제곱한 것을 문자열로 바꾸고 두 부분으로 나누고 또 정수형으로 바꿔야 하는 과정이 많다.
결과를 담을 StringBuilder를 선언한다.
StringBuilder sb = new StringBuilder();
for문을 통해 p에서 q까지 반복한다. 이때 i는 int 범위를 벗어날 수도 있어서 long으로 선언한다.
for(long i = p; i <= q; i++){
}
이제 modified Kaprekar number를 찾으면 된다. if문을 통해 범위 안에 1이 있다면 sb에 담아주고, 제곱한 수의 자리가 2보다 작을 경우 무시하고 넘아간다.
for(long i = p; i <= q; i++){
if(i == 1){
sb.append(i);
sb.append(" ");
continue;
}
String square = String.valueOf(i * i);
if(square.length() < 2){
continue;
}
}
그 외의 수들은 modified Kaprekar number인지 확인한다. 제곱한 값의 중간 자리인 m과 시작부터 m까지의 부분 문자열 l, m부터 끝까지의 부분 문자열 r을 구한다. 만약 l과 r의 합이 i와 같다면 sb에 담아준다.
for(long i = p; i <= q; i++){
// 생략
int m = square.length() / 2;
long l = Long.valueOf(square.substring(0, m));
long r = Long.valueOf(square.substring(m, square.length()));
if(l + r == i){
sb.append(i);
sb.append(" ");
}
}
마지막으로 sb의 길이가 0이면 INVALID RANGE를 출력하고 그렇지 않다면 sb를 출력한다.
if(sb.length() == 0){
System.out.println("INVALID RANGE");
}else{
System.out.println(sb);
}
public static void kaprekarNumbers(int p, int q) {
StringBuilder sb = new StringBuilder();
for(long i = p; i <= q; i++){
if(i == 1){
sb.append(i);
sb.append(" ");
continue;
}
String square = String.valueOf(i * i);
if(square.length() < 2){
continue;
}
int m = square.length() / 2;
long l = Long.valueOf(square.substring(0, m));
long r = Long.valueOf(square.substring(m, square.length()));
if(l + r == i){
sb.append(i);
sb.append(" ");
}
}
if(sb.length() == 0){
System.out.println("INVALID RANGE");
}else{
System.out.println(sb);
}
}