[HackerRank] Modified Kaprekar Numbers

아르당·2023년 11월 27일
0

HackerRank

목록 보기
34/109
post-thumbnail

문제를 이해하고 있다면 바로 풀이를 보면 됨
전체 코드로 바로 넘어가도 됨
마음대로 번역해서 오역이 있을 수 있음

문제

수정된 Kaprekar number는 특별한 속성을 가진 양의 정수다. 수를 제곱하고, 두 개의 정수로 나누고 그 정수를 합한다면 시작한 값과 같은 값을 갖는다.
d 자리의 양의 정수 n이 주어진다. n을 제곱해서 2 d 또는 2 d - 1의 자리인 숫자를 구한다. l과 r 두 부분으로 나눠서 제곱된 수를 문자열로 나눈다. 오른쪽 부분인 r은 d 자리까지의 길이여야 한다. 왼쪽 부분은 남은 부분 문자열이다. 두 문자열을 정수로 변환하고, 더 했을 때 결과가 n과 같은지 확인해라.

Example

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과 같다.

Function Description

kaprekarNumbers 함수를 완성해라.
kaprekarNumbers 함수는 아래와 같은 매개변수를 가지고 있다.

  • int p: 최소값
  • int q: 최대값

Prints

공백으로 구분되고 오름차순으로 정렬된 수정된 Kaprekar numbers 리스트를 출력해야한다. 만약 수정된 Kaprekar numbers가 없는 범위가 주어진다면 INVALID RANGE를 출력해라. 반환 값은 필요없다.

Constraints

  • 0 < p < q < 100000

풀이

문제는 쉽지만 숫자를 제곱한 것을 문자열로 바꾸고 두 부분으로 나누고 또 정수형으로 바꿔야 하는 과정이 많다.

결과를 담을 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);
	}
}
profile
내 마음대로 코드 작성하는 세상

0개의 댓글