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

Kotlin] 백준 2745번 문제풀이

by 김마리님 2023. 6. 14.

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

 

2745번: 진법 변환

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

www.acmicpc.net

 

 

풀이

더보기

이 문제를 풀려면 먼저 n진법을 어떻게 10진법으로 만드는지 봐야한다.

예를 들어 3진법으로 2102(3)라고 되어있는 수를 10진법으로 바꾼다고 가정한다.

2는 3^3의 자리, 1은 3^2의 자리, 0은 3^1의 자리, 2는 3^0의 자리이다.

이를 좀 더 표로 보면

2 1 0 2
3^3 3^2 3^1 3^0

따라서 2103(3)은 2*3^3 + 1*3^2 + 0*3^1 + 2*3^0 = 54 + 9 + 0 + 2 = 65가 된다.

마찬가지로, 이번 문제도 주어진 숫자 * 주어진 진법 ^ 해당 자릿수 로 구할 수 있다.

이때 자릿수는 앞으로 갈수록 크므로,

먼저 받아온 수를 charArray를 이용해 떼어낸다.

그리고 이를 반복문으로 돌리는데, 배열의 가장 낮은 인덱스가 가장 높은 자릿수를 가진다.

이를 해결하는 방법은 저 위의 예시에 있는데, 0번째는 길이 - 1, 1번째는 길이 -2 .. 이렇게 되기때문에 반복문을 1로 시작한다면 length - i, 0부터 시작한다면 length - i -1로 자릿수를 구할 수 있다.

이제 숫자 배열에서 인덱스를 찾아 인덱스 * 지정 진법 ^ 자릿수를 하자.

 

이를 전체 더하면 결과가 나온다.

 (케이스코드보단 아스키코드로 하려 했으나 그렇게 하면 식이 길어지고 계산 복잡도가 늘어날거 같아서 그냥 부동배열을 만들고 인덱싱 참고하는게 낫겠다는 판단을 함)

import kotlin.math.pow

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

fun question2745() {
    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 number10 = 0.0
    var case = readLine()!!.split(" ")
    var numberArray = case[0].toCharArray()

    for(i in 1 .. numberArray.size) {
        var number = caseCode.indexOf(numberArray[i - 1].toString())
        number10 += case[1].toDouble().pow(numberArray.size - i) * number
    }

    println(number10.toInt())
}
반응형