Kotlin 사전캠프 TIL 1~2일차

노재원·2024년 3월 20일
0

내일배움캠프

목록 보기
2/90

되돌아오는 기억들 조각모음하기

실무를 뛸 때도 느꼈지만 실력은 얕으면서 트렌드, 장비에는 참 관심이 많았다.
이게 사전캠프에도 여김없이 발휘돼서 2일차까지 먼지 묻은 장비들 씻어내고 요즘 트렌드 조사하고 개발 환경을 온오프라인 가리지 않고 세팅하느라 시간을 참 많이 썼다.

아직 KDT 신청이 완전히 끝나진 않아 강의 배정은 되지 않아서 대신 데일리 루틴의 알고리즘 문제들을 풀어나갔는데 어느정도는 기억나지만 당장 반복문도 가물가물하며 작성하는 걸 보면 재활치료엔 아직 더 많은 시간이 필요할 것 같다.

간단한 알고리즘 문제지만 재활 과정중 Kotlin의 특성을 살려서 간결하게 풀어냈거나 고민해본 문제들을 가져왔다. 매니저님이 백준허브를 알려주셔서 문제 정리에도 큰 도움이 된다.


두 수의 나눗셈

정수 num1num2가 매개변수로 주어질 때, num1num2로 나눈 값에 1,000을 곱한 후 정수 부분을 return 하도록 soltuion 함수를 완성해주세요.

문제 링크

    fun solution(num1: Int, num2: Int): Int {
        var answer: Int = 0
        // 최초 답안, 명시적 캐스팅으로 계산
        // answer = ((num1 / num2.toDouble()) * 1000).toInt()
        // 수정 답안, 간결하게 표현함 암시적 캐스팅으로 연산에 미리 Double을 줘서 자동 캐스팅함
        answer = (num1 * 1000.0 / num2).toInt()
        return answer
    }

해당 문제는 소수점 계산까지 포함하고 있기에 Int에서 Double로 캐스팅을 해줘야 한다.
캐스팅도 여러 방법이 가능하기에 최초 답안을 작성하고 추가로 찾아보고 수정 답안으로 바꿨다.
퍼포먼스는 고려하지 않았고 코드의 가독성만을 고려한 결과물인데 사실 장점만 있는 건 아니고 암시적 캐스팅을 적용했을 때는 리뷰할 때 헷갈릴 여지가 있다는 점을 항상 염두에 두고 특히 팀 프로젝트라면 명시적 캐스팅으로 리뷰어가 쉽게 의도를 해석할 수 있게 하는 것도 장점이라고 생각한다.

각도기

각에서 0도 초과 90도 미만은 예각, 90도는 직각, 90도 초과 180도 미만은 둔각 180도는 평각으로 분류합니다. 각 angle이 매개변수로 주어질 때 예각일 때 1, 직각일 때 2, 둔각일 때 3, 평각일 때 4를 return하도록 solution 함수를 완성해주세요.

문제 링크

fun solution(angle: Int): Int {
        var answer: Int = 0
        answer = if (0 < angle && angle < 90) {
            1
        } else if (angle == 90) {
            2
        } else if (90 < angle && angle < 180) {
            3
        } else {
            // if-else if문을 사용하여 변수에 즉시 값을 대입할때는 else가 선택사항이 아니라 필수
            // angle에 대한 문제의 제한사항이 정해져 있어 해당 문제에선 이렇게 사용할 수 있지만 이외의 경우엔 예외가 발생 가능
            4
        }
        return answer
    }

해당 문제는 자칫 지저분할 수 있는 제어문을 조금이나마 더 줄여서 썼다.
Kotlin은 If문을 사용할 때 값을 즉시 대입할 수 있는데, 이때 else를 지정하지 않으면 에러가 발생한다. 이미 answer는 0으로 초기화 되어있지만 If문을 대입 표현으로 사용하게 되면 최종 결과값이 비어버리는 경우가 발생할 수 있으므로 else를 Default 값의 개념으로 사용한다.

다만 해당 문제는 0 < angle ≤ 180 으로 지정되어 있기에 else 블록을 지정한 것이지 만약 angle이 180을 넘어갈 수 있다면 If를 대입 표현으로 사용하지 말고 코드가 길어져도 확실하게 answer = 1, 2, 3, 4로 명시해주거나 else의 값을 -1 등의 숫자로 지정해 에러임을 명확히 하는게 좋다.

x만큼 간격이 있는 n개의 숫자

자연수 n을 뒤집어 각 자리 숫자를 원소로 가지는 배열 형태로 리턴해주세요. 예를들어 n이 12345이면 [5,4,3,2,1]을 리턴합니다.

문제 링크

fun solution(n: Long): IntArray {
        var answer = mutableListOf<Int>()
        var number: Long = n
        
        while (number > 0) {
            answer.add((number % 10).toInt())
            number /= 10
        }
        
        return answer.toIntArray()
    }

해당 문제는 IntArray의 반환을 요구하지만 Int로 계산해선 안되는 Test case가 존재한다. n이 Long으로 주어진게 힌트인데 Int는 4바이트로 -2^31 ~ 2^31 - 1 (약 21억) 의 범위를 지녀서 n이 범위를 초과하게 주어지면 테스트에 실패한다. Long > Int 캐스팅을 여러 곳에서 할 필요는 없고 answer에 포함되는 값은 자릿수인 1개의 숫자만 기록되니 한 번만 사용하고 mutableList를 IntArray로 변환해 제출하고 통과했다.


시간에 쫓기는게 아니니 간단한 알고리즘 문제여도 Kotlin의 특성을 활용할 여지가 있는지, 다른 방법이 있는지 등을 차근차근 곱씹어보고 제출을 하고 있다. 특히 고민의 많은 부분이 비록 실무중 팀은 나 혼자였지만 누군가가 리뷰를 한다는 가정하에 명시적으로 작성할 때가 많았는데 그 때의 경험이 많이 반영되고 있다. 홀라당 문제를 풀고 넘어간다고 능사가 아니니 풀린 문제도 한 번 더 되짚고 가자.

1개의 댓글

comment-user-thumbnail
2024년 3월 24일

제가 딱히 말씀드릴 부분이 없을 정도로 잘 써주셔서 재미있게 읽었습니다.
추후 팀원들과의 라포를 쌓는다거나 코드나 코드 외적으로도 도움을 주실 수 있는 포지션까지 가능하실 거 같아서 매니저로서 든든합니다.

앞으로도 잘부탁드립니다!

답글 달기