티스토리 뷰

안드로이드/코드

코드 분석하기

알렌보이스 2023. 6. 28. 20:59
728x90

 

https://toss.im/career/article/next-developer-2023-sample-questions

 

[토스 NEXT] 2022년 코딩테스트 기출문제를 공개해요

약 8,000명의 지원자가 있었던 2022년 토스 NEXT 개발자 챌린지. 많은 인원이 참여한 만큼, 지원자의 역량을 더 면밀히 검증할 수 있도록 토스의 각 챕터 (Frontend, Server 등의 기술 조직) 에서도 문제

toss.im

오늘은 지인이 소개해준 토스 NEXT 2022년 코딩테스트 기출문제를 보았습니다.

다른 파트는 코드를 사용해 본 적이 없거나 오래돼서 분석하려면 시간이 걸려서 안드로이드만 보았습니다.

문제 자체는 심플한 것 같습니다.
유효성 검사와 정렬하는 것이라서 결과만 놓고 봤을 땐 시간만 주어진다면 깔끔하진 않아도 어떻게든 결과는 보지 않았을까 싶네요.

class Solution {

    fun solution(assets: Array<String>): Array<String> =
        assets.mapNotNull { asset -> runCatching { asset.toAssetResult() }.getOrNull() }
            .sorted()
            .filter(Asset::isValid)
            .map(Asset::text)
            .distinct()
            .toTypedArray()

}

object ValidationError : Throwable()


fun String.toAssetResult(): Asset =
    when {
        length != 9 -> throw ValidationError
        slice(0..1).toIntOrNull() == null -> throw ValidationError
        get(2) != '-' -> throw ValidationError
        runCatching { Asset.Type.valueOf(slice(3..4)) }.isFailure -> throw ValidationError
        slice(5..6).toIntOrNull() == null -> throw ValidationError
        slice(7..8).toIntOrNull() == null -> throw ValidationError
        else -> Asset(
            text = this,
            yy = slice(0..1).toInt(),
            type = Asset.Type.valueOf(slice(3..4)),
            mm = slice(5..6).toInt(),
            no = slice(7..8).toInt()
        )
    }

data class Asset(
    val text: String,
    val yy: Int,
    val type: Type,
    val mm: Int,
    val no: Int
) : Comparable<Asset> {

    enum class Type {
        SP, KE, MO, CO, DE
    }

    val isValid: Boolean
        get() {
            return (yy in 13..22) && (mm in 1..12) && when {
                yy == 13 && mm < 4 -> false
                yy == 22 && mm > 8 -> false
                else -> true
            } && (no in 1..99)
        }

    override fun compareTo(other: Asset): Int {
        return when {
            yy > other.yy -> 1
            yy < other.yy -> -1
            type.ordinal > other.type.ordinal -> 1
            type.ordinal < other.type.ordinal -> -1
            mm > other.mm -> 1
            mm < other.mm -> -1
            no > other.no -> 1
            no < other.no -> -1
            else -> 0
        }
    }

}

사이트에 올라온 모범 답안입니다.

모범 답안을 보고 처음 느낀 점은 이 문제를 약 70 라인으로 해결할 수 있는 문제 구나 싶었습니다.

두 번 째는 data class를 저렇게 사용할 거라고는 생각은 전혀 못했습니다.
만약 제가 저 문제를 풀었다면 data class는 만들지 않고 여러 개의 함수들로만 처리하려고 했을 것입니다.
꼭 저렇게 해야 하는 건 아니겠지만 볼수록 코드가 깔끔해서 보기 좋네요.

다음은 이 코드를 보면서 배운 것들입니다.

1. runCatching

저는 runCatching이라는 것을 처음 접했습니다.

처음 보는 것이었지만 어떤 의미인지는 바로 알 수 있었습니다.

@InlineOnly
@SinceKotlin("1.3")
public inline fun <T, R> T.runCatching(block: T.() -> R): Result<R> {
    return try {
        Result.success(block())
    } catch (e: Throwable) {
        Result.failure(e)
    }
}

함수의 구조는 위와 같습니다.

내부에서 try-catch문을 사용하여 success, failure 정보를 가진 Result를 반환합니다.

try-catch가 빠졌을 뿐인데도 코드가 훨씬 가독성이 좋고 깔끔해졌다는 게 느껴지네요.

앞으로 자주 이용해 봐야겠습니다.

 

2. Comparable

이 부분은 배운긴 했을 텐데 안 쓴 지 오래되어서 까먹은 것 같습니다.

https://st-lab.tistory.com/243

 

자바 [JAVA] - Comparable 과 Comparator의 이해

아마 이 글을 찾아 오신 분들 대개는 Comparable과 Comparator의 차이가 무엇인지 모르거나 궁금해서 찾아오셨을 것이다. 사실 알고보면 두 개는 그렇게 어렵지 않으나 아무래도 자바를 학습하면서 객

st-lab.tistory.com

그래서 위에 블로그를 보면서 차근차근 공부를 하였습니다.

상세히 설명을 잘 써주셔서 이해하기 좋았습니다.😊

 

 

이번 코드 분석한 것을 가지고 며칠 뒤에 한번 문제만 보고 풀어봐야겠습니다.

그리고 runCatching은 진행 중인 프로젝트에 바로 적용할 수 있는 내용이어서

다음에 작업할 때 적용해 봐야겠습니다.

728x90

'안드로이드 > 코드' 카테고리의 다른 글

Mj App : 달력  (0) 2023.06.27
Mj App : 게임 - 포켓몬  (0) 2023.06.27
Mj App : 게임 - 엘소드  (0) 2023.06.27
Mj App : 공통  (0) 2023.06.27
Compose 내 관리앱 만들기 : 3. 교통 - 지하철  (0) 2023.03.19
댓글