본문 바로가기
스터디(beakjoon)

Kotlin] 백준 11005번 문제풀이

by 김마리님 2023. 6. 15.

https://www.acmicpc.net/problem/11005

 

11005번: 진법 변환 2

10진법 수 N이 주어진다. 이 수를 B진법으로 바꿔 출력하는 프로그램을 작성하시오. 10진법을 넘어가는 진법은 숫자로 표시할 수 없는 자리가 있다. 이런 경우에는 다음과 같이 알파벳 대문자를

www.acmicpc.net

 

 

풀이

더보기

(개같이 멸망함)

 

최대값이 얼마까지 가는지 모르므로 일단 while문을 돌린다.

count로 자릿수를 설정해놓고 만약 진수의 제곱을 나누었을때 해당 진수의 n제곱보다 크게 나오면 이건 좀 더 나눠야 한단 뜻이므로 카운팅을 올린다.

만약 해당진수의 n제곱보다 작게 나오면 해당 몫을 가장 큰 수로 저장하고, 나눈 몫을 나머지로 나머지 아랫수를 구한다.

 

왜 그렇게 되냐고? 10진수를 살펴보면,

362라는 숫자가 있다 치자. 3이 가장 큰 수이므로 362 / (10^2) 하면 몫이 3이 나오므로 10진수의 3의 자리는 3, 362 % (10^2) 하면 나머지가 62이므로, 이것으로 아랫차수를 계산한다.

 

이제 자릿수 카운트를 구했으므로, 0이 아니라면(1의 자리수에서 끝난게 아니라면) for문을 통해 i를 최고점에서 -1씩 줄여가면서 마찬가지로 몫을 나눠 저장하고, 나머지는 계산값에 저장해서 0이 될때까지 반복한다.

 

import kotlin.math.pow

fun main(args: Array<String>) {
    question11005()
}

fun question11005() {

    var caseCode = arrayOf(
        "0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
        "A", "B", "C", "D", "E", "F", "G", "H", "I", "J",
        "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T",
        "U", "V", "W", "X", "Y", "Z" )

    var item = readLine()!!.split(" ").map { it.toInt() }
    var number10 = item[0].toDouble()
    var square = item[1].toDouble()
    var returnNumber = ""

    var count = 0
    while (true) {
        var calc = number10 / square.pow(count)
        if (calc < square) {
            returnNumber += caseCode[calc.toInt()]
            number10 %= square.pow(count)
            break
        } else {
            count += 1
        }
    }
    //이미 가장 큰 자리를 더했으므로 count -1 하고 downTo로 내려가봄.
    if(count != 0) {
        for (i in (count - 1) downTo 0) {
            returnNumber += caseCode[(number10 / square.pow(i)).toInt()]
            number10 %= square.pow(i)

        }
    }
    
    println(returnNumber)
}
반응형