https://www.acmicpc.net/problem/2745
풀이
더보기
이 문제를 풀려면 먼저 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())
}
반응형
'스터디(beakjoon)' 카테고리의 다른 글
Kotlin] 백준 2720번 문제풀이 (0) | 2023.06.15 |
---|---|
Kotlin] 백준 11005번 문제풀이 (0) | 2023.06.15 |
Kotlin] 백준 10798번 문제풀이 (0) | 2023.06.14 |
Kotlin] 백준 10798번 문제풀이 (0) | 2023.06.13 |
Kotlin] 백준 2738번 문제풀이 (0) | 2023.06.13 |