티스토리 뷰
https://toss.im/career/article/next-developer-2023-sample-questions
오늘은 지인이 소개해준 토스 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
그래서 위에 블로그를 보면서 차근차근 공부를 하였습니다.
상세히 설명을 잘 써주셔서 이해하기 좋았습니다.😊
이번 코드 분석한 것을 가지고 며칠 뒤에 한번 문제만 보고 풀어봐야겠습니다.
그리고 runCatching은 진행 중인 프로젝트에 바로 적용할 수 있는 내용이어서
다음에 작업할 때 적용해 봐야겠습니다.
'안드로이드 > 코드' 카테고리의 다른 글
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 |
- Total
- Today
- Yesterday
- Compose 네이버 지도
- compose
- 안드로이드 구글 지도
- Fast api
- Compose ConstraintLayout
- 안드로이드
- Android
- 웹뷰
- Pokedex
- Gradient
- Worker
- Kotlin
- Compose QRCode Scanner
- Compose BottomSheetScaffold
- WebView
- Row
- Compose Naver Map
- Android Compose
- Compose BottomSheet
- Retrofit
- Compose ModalBottomSheetLayout
- Duplicate class fond 에러
- column
- 포켓몬 도감
- Compose MotionLayout
- Compose 네이버 지도 api
- Duplicate class found error
- Compose BottomSheetDialog
- WorkManager
- LazyColumn
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |