문제 출처 : https://www.acmicpc.net/problem/9047
언어 : Kotlin
문제 설명 :
1949 년 인도 수학자 Kaprekar 는 Kaprekar 연산을 고안해냈다. Kaprekar 연산은 네 자리 수 중 모든 자리수가 같지 않은 수(1111, 2222 등을 제외한)의 각 자리의 숫자를 재배열해서 만들 수 있는 가장 큰 수와 가장 작은 수를 만들어서 그 차이를 계산하는데, 그 결과로 나온 새로운 숫자를 갖고 같은 과정을 반복하는 것이다.
간단한 연산이지만 Kaprekar 는 이 연산이 놀라운 결과를 보여준다는 것을 발견했다. 올해 연도인 2008 로 그 결과를 알아보자. 2008 로 만들 수 있는 가장 큰 수는 8200 이고 가장 작은 수는 0028 이다.
- 8200 – 0028 = 8172
- 8721 – 1278 = 7443
- 7443 – 3447 = 3996
- 9963 – 3699 = 6264
- 6642 – 2466 = 4176
- 7641 – 1467 = 6174
- 7641 – 1467 = 6174
6174 에 도달한 다음에는 매번 6174 를 만들어 낸다. 2008 만이 유독 6174 에 도달하는 것이 아니라 한 숫자로 이루어지지 않은 모든 네 자리 수는 Kaprekar 연산을 통해 6174 로 가게 된다. 2008 의 경우 6 단계를 거쳐 6174 로 가게 되었는데, 다른 숫자가 입력으로 주어졌을 때 몇 단계만에 6174 로 가는지 알아내는 프로그램을 작성하시오.
입력 :
입력은 표준입력(standard input)을 통해 받아들인다. 입력의 첫 줄에는 테스트 케이스의 개수 T(1 ≤ T ≤ 20)가 주어진다. 각 테스트 케이스마다 한 줄에 네 자리 수(1000~9999)가 하나씩 주어진다. 단, 이 숫자는 1111, 2222 처럼 하나의 숫자로 이루어진 수는 제외한다.
출력 :
출력은 표준출력(standard output)을 통하여 출력한다. 각 테스트 케이스에 대하여 Kaprekar 연산을 통해 몇 단계 만에 6174가 되는지 한 줄에 하나씩 출력하시오.
제한 사항 :
- 시간 제한 : 1초
- 메모리 제한 : 128MB
입출력 예 :
입력 | 출력 |
3 6174 1789 2005 |
0 3 7 |
풀이 :
import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter
fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {
val bw = BufferedWriter(OutputStreamWriter(System.out))
repeat(readLine().toInt()) {
bw.appendLine("${kaprekar(readLine())}")
}
bw.flush()
bw.close()
}
fun kaprekar(str: String): Int {
var result = str
var count = 0
while (result != "6174") {
val max = result.toCharArray().sortedDescending().joinToString("").toInt()
val min = result.toCharArray().sorted().joinToString("").toInt()
result = (max - min).toString()
if (result.length < 4) result = result.padStart(4, '0')
count += 1
}
return count
}
'백준 > 문제' 카테고리의 다른 글
14915번: 진수 변환기 (0) | 2024.05.07 |
---|---|
14713번: 앵무새 (0) | 2024.05.07 |
2703번: Cryptoquote (0) | 2024.05.06 |
4613번: Quicksum (0) | 2024.05.06 |
15814번: 야바위 대장 (0) | 2024.05.06 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!