728x90
조건
자연수 n이 매개변수로 주어집니다. n을 3진법 상에서 앞뒤로 뒤집은 후, 이를 다시 10진법으로 표현한 수를 return 하도록 solution 함수를 완성해주세요.(n은 1 이상 100,000,000 이하인 자연수입니다.)
알고리즘 예상
- n을 3진법으로 바꾼다.
- 3진법으로 표현된 n을 배열로 바꾸어 뒤집고 다시 Int 자료형으로 바꾼다.
- 3진법 Int자료형을 10진법으로 바꾼다.
초기 코드
class Solution {
fun solution(n: Int): Int {
var answer: Int = 0
return answer
}
}
내 코드
import kotlin.math.pow
class Solution {
fun solution(n: Int): Int {
var answer: Int = 0
var deToTe = n
var ternary : String = ""
while(deToTe != 0){
ternary += (deToTe%3).toString()
deToTe /= 3
}
for(i in ternary.indices) answer += ternary[i].toString().toInt()*(3.0).pow(ternary.length-i-1).toInt()
return answer
}
}
일단 생각나는대로 코드를 짜보았다. 뒤집는 과정 없이 3진법 반전수를 ternary변수에 바로 저장해서 사용했다. 최적화를 위해서 아래 for문을 forEachIndexed를 이용해 간단하게 해보고자 한다.
import kotlin.math.pow
class Solution {
fun solution(n: Int): Int {
var answer: Int = 0
var deToTe = n
var ternary : String = ""
while(deToTe != 0){
ternary += (deToTe%3).toString()
deToTe /= 3
}
ternary.reversed().forEachIndexed {i,c -> answer+= c.toString().toInt()*(3.0).pow(i).toInt() }
return answer
}
}
결국 pow, while문으로 인해 지저분한 코드가 되었다.
다른 사람의 풀이
class Solution {
fun solution(n: Int): Int {
return n.toString(3).reversed().toInt(3)
}
}
개선점 또는 배운점
- 풀면서도 작동에 문제는 없지만 저게 맞나 싶은 코드였지만 결국 toString, toInt등의 자료형 변환함수에 대해 똑바로 알지 못해서 일어나는 일이었다. toString() 괄호 내부에 radix를 넣으면 들어간 radix에 맞는 진수로 변환해서 문자열로 바꿔준다. toInt() 괄호 내부에 radix를 넣으면 해당 radix진수를 10진수로 바꾸어준다. radix는 2이상 36이하의 값을 가진다.
개선된 코드
class Solution {
fun solution(n: Int): Int = n.toString(3).reversed().toInt(3)
}728x90
'TIL > 알고리즘' 카테고리의 다른 글
| 02/13 알고리즘 공부(42) - 삼총사 (1) | 2024.02.13 |
|---|---|
| 02/13 알고리즘 공부(41) - 이상한 문자 만들기 (1) | 2024.02.13 |
| 02/07 알고리즘 공부(39) - 최대공약수와 최소공배수 (0) | 2024.02.07 |
| 02/07 알고리즘 공부(38) - 직사각형 별찍기 (0) | 2024.02.07 |
| 02/07 알고리즘 공부(37) - 행렬의 덧셈 (0) | 2024.02.07 |