Kotlin 사전캠프 TIL 17일차

노재원·2024년 4월 11일
0

내일배움캠프

목록 보기
17/90

본 캠프전 마지막 정비

원래 내일이 마지막이지만 민방위가 겹쳐서 본 캠프전에 빠르게 다녀오려고 불참하게 됐다.
그래도 오늘 매니저님께서 본캠프가 어떻게 이루어질지 질답을 해주시고 재밌는 이야기도 많이 들려주셔서 본캠프에 대한 호기심도 커졌고 의욕도 늘어난 것 같다.

내가 듣는 Kotlin 트랙 2기는 소수정예가 돼서 배우는 데엔 굉장히 이점이 클 것 같고 평가나 질답의 기회 또한 훨씬 잦을 것 같아 학교 때처럼 안일하게 있다가 뒤처지는 일이 발생하지 않게 주의해야겠다. 이번 부트캠프의 제1목표는 별다른 이슈없이 무사 수료다.


3진법 뒤집기

자연수 n이 매개변수로 주어집니다. n을 3진법 상에서 앞뒤로 뒤집은 후, 이를 다시 10진법으로 표현한 수를 return 하도록 solution 함수를 완성해주세요.

문제 링크

fun solution(n: Int): Int {
        var answer: Int = 0
        var list: MutableList<Int> = mutableListOf()
        var number = n
        
        while (number > 0) {
            list.add(number % 3)
            // 3진법을 정순서로 저장하고 싶은 경우
            // list.add(0, number % 3)
            number /= 3
        }
        
        answer = list.foldIndexed(0) { index, acc, num -> acc + (num * Math.pow(3.0, list.count() - index - 1.0)).toInt() }
        
        return answer
    }

진법을 구하는 수식은 아주 가끔씩이지만 볼 일이 있어서 문제는 없었다. 세부적으로 이 방식이 거꾸로 저장되는건 이번에 로그를 찍으면서 처음 알긴 했는데 풀이에 이슈가 되진 않았다.

선택한 해결법은 index, 합산, 값이 모두 필요하기 때문에 이전에 사용했던 foldIndexed를 사용했다. 개인적으로 만족하는 방법이지만 pow의 연산에 list.count()가 지속적으로 참조된 건 아쉬움이 남았다.

제출하고 참고한 다른 풀이의 경우 list를 뒤집거나 for문으로 index를 조정해서 불필요한 호출을 줄이는 경우도 있지만 큰 맥락은 비슷했다. 나도 해답의 방식을 유지한다면 count를 따로 빼면 됐는데 디테일이 조금 부족했다.

그리고 풀이엔 문제 없었지만 문제와 달리 3진법 상에서 이미 뒤집힌 채로 계산한 방식인 것도 신경쓰여 코멘트를 추가했는데 list의 index를 계속 0으로 지정해 추가해줄 경우 정순서로 3진법을 저장할 수 있다.


그리고 3진법 연산 또한 편하게 할 방법이 있을 거라 생각은 했지만 잘 모르니 기본적인 방법으로 푼 건데 다른 분의 풀이로 찾아낸 정말 쉬운 방법이 있었다.

n.toString(3).reversed().toInt(3)

toString(radix: Int)toInt(radix: Int) 를 지원해서 진법간 변환이 정말 간단하다. kotlin에서 지원하기 시작한 것도 아니고 Java 에서도 사용가능한 문법이었다. 역시 아는 것이 힘이 아닐까?

0개의 댓글