[24.06.27] TIL - 020

🎧 0. 오늘의 추천곡

오늘 뭘 했는지 적어도 어차피 나중에 다 말해서 딱히 의미가 없는 것 같더라고요.

그래서 오늘부터는 뭘 했는지보다도 매일 노래 하나씩 추천하겠습니다.

오늘은 김광석 - 잊어야 한다는 마음으로 입니다.

💻 1. 코드 카타

오늘의 코드 카타는 K진수에서 소수 개수 구하기 입니다.

오늘 문제는 생각보다 보기에도 쉬워보였고, 얼마 안 걸릴 거라 생각했습니다.

그리고 한 가지 개념만 알면 그 생각이 맞았습니다.

먼저 문제 내용입니다.

양의 정수 n이 주어집니다. 이 숫자를 k진수로 바꿨을 때, 변환된 수 안에 아래 조건에 맞는 소수(Prime number)가 몇 개인지 알아보려 합니다.
0P0처럼 소수 양쪽에 0이 있는 경우
P0처럼 소수 오른쪽에만 0이 있고 왼쪽에는 아무것도 없는 경우
0P처럼 소수 왼쪽에만 0이 있고 오른쪽에는 아무것도 없는 경우
P처럼 소수 양쪽에 아무것도 없는 경우
단, P는 각 자릿수에 0을 포함하지 않는 소수입니다.
예를 들어, 101은 P가 될 수 없습니다.
예를 들어, 437674을 3진수로 바꾸면 211020101011입니다. 여기서 찾을 수 있는 조건에 맞는 소수는 왼쪽부터 순서대로 211, 2, 11이 있으며, 총 3개입니다. (211, 2, 11을 k진법으로 보았을 때가 아닌, 10진법으로 보았을 때 소수여야 한다는 점에 주의합니다.) 211은 P0 형태에서 찾을 수 있으며, 2는 0P0에서, 11은 0P에서 찾을 수 있습니다.
정수 n과 k가 매개변수로 주어집니다. n을 k진수로 바꿨을 때, 변환된 수 안에서 찾을 수 있는 위 조건에 맞는 소수의 개수를 return 하도록 solution 함수를 완성해 주세요.

즉, 0을 기준으로 문자열을 잘라서, 나머지 숫자들이 소수인지만 확인하면 됩니다.

여기서 가장 큰 문제는 소수를 구하는 데 있어 너무 크면, 시간 초과가 발생한다는 것입니다.

그래서 여기서 적용돼야 할 개념이 에라토스테네스의 체입니다.

이 개념은 2부터(1은 소수가 절대 아님) 소수인지 확인하는 내용입니다.

이중 소수의 배수들은 전부 제외하게 됩니다.

여기서 특별한 공식을 알 수 있습니다. 모든 수는 해당 수의 제곱근 값 이하의 수를 약수로 가진다는 점입니다.

예를 들어, 16과 같은 경우, 2와 8, 4가 있습니다. 12는 2와 8, 3과 4가 있습니다.

그러므로, 해당 숫자가 해당 숫자의 제곱근까지 나눠지는지만 확인하면 됩니다.

기존에 제가 쓰던 방식은 2로 나눴을 때까지 구하는 거였는데, 이런 방식이 있었는지는 최근에 스크럼을 통해 알았습니다.

import kotlin.math.sqrt

class Solution {
    fun solution(n: Int, k: Int): Int {
        var answer: Int = 0
        val kn = StringBuilder(n.toString(k))
        val knTo10List = kn.split("0").filter { it.isNotEmpty() }.map { it.toLong() }
        var isPrime = true
        knTo10List.forEach {
            isPrime = true
            if(it != 1L) {
                for(i in 2..sqrt(it.toDouble()).toInt()) {
                    if(it % i == 0L) isPrime = false
                }
            } else isPrime = false
            if(isPrime) answer++
        }
        return answer++
    }
}

👾 2. 과제

오늘은 Data Class를 추가해서 해당 클래스를 인텐트로 보내는 코드를 추가했습니다.

여기서 처음 보는 내용이 나왔는데, Parcelize와 Parcelable 이었습니다.

간단하게 얘기하면, Parcelable은 class를 메시지로 보내는 방법을 제공하는 인터페이스입니다.

그리고, @Parcelize는 그런 Parcelable을 단 한 줄의 코드만으로 줄인 어노테이션입니다.

어노테이션은 은근히 자주 보여서 나중에 한번 공부해봐야 할 것 같습니다.

@Parcelize
data class UserClass(val id: String, val pwd: String, val name: String, val chicken: String) : Parcelable

코드는 위와 같이 작성해줬습니다.

⭐ 3. 코틀린 공부

오늘은 확장 람다에 대해 공부했습니다.

근데 아직 활용법에 대해서는 완벽히 이해 못했습니다.

우선 확장 람다는 확장 함수의 람다 버전입니다.

그래서 다음과 같이 람다를 확장 람다로 변경할 수 있습니다.

// 기존 람다
val a: (String, Int) -> Unit = { str, i ->

}
// 확장 람다
val a: String.(Int) -> Unit = { 
	// String은 this로, Int는 it으로 쓸 수 있음.
}

또한, 매개변수로 람다가 있어도 확장 람다 타입을 인자로 넣어줄 수 있습니다.

그리고, 확장 람다 타입은 String의 확장된 부분은 (Int)가 아니라 (Int) -> Unit 부분입니다.

이렇게 기초만 일단 공부하고, 내일 더 쌓아보도록 하겠습니다.

📱 4. 안드로이드 공부

안드로이드는 저번에 공부했던 Box와 커스텀 모디파이어, 레이아웃에 대해 공부했습니다.

오늘은 저번에 설명 못했던 Row, Column 스코프 내의 모디파이어와 Box에 대해 설명하고,

내일 다시 커스텀 모디파이어와 레이아웃에 대해 설명하겠습니다.

일단, Box는 상자처럼 위로 쌓이는 형태입니다. 즉, 특정 모디파이어를 적용시켜주지 않으면 한 자리에 계속 쌓입니다.

먼저, Box에 적용할 수 있는 대표적인 모디파이어는 contentAlignment입니다.

Box(contentAlignment = Alignment.Center) { }

이렇게 하면 Box의 내용물들이 전부 부모를 기준으로 가운데로 가게 됩니다.

Box가 이런 기능만 있으면 쓰일 이유가 없겠지만, BoxScope 내의 모디파이어가 있습니다.

근데, 이건 다른 Row나 Column Scope도 마찬가지이므로, 같이 설명하겠습니다.

Row {
	Text(modifier = Modifier.align(Alignment.CenterVertically))
}

위처럼 설정하면, 해당 컴포저블만 Row 내에서 열의 가운데로 이동합니다.

또한, Text 같은 경우는 텍스트 사이에서의 Align도 설정할 수 있습니다.

Row {
	Text(modifier = Modifier.alignByBaseLine())
    Text(modifier = Modifier.alignByBaseLine())
}

위처럼 하면, 서로의 베이스라인에 맞게 위치가 조정됩니다.

여러 줄일 경우, 끝에 맞추거나 처음에 맞추는 걸 고를 수도 있습니다.

Row {
	Text(modifier = Modifier.alignBy(FirstBaseLine))
    Text(modifier = Modifier.alignByBaseLine())
}

위처럼 FirstBaseLine이라 적힌 부분에 아래 텍스트가 처음에 맞춰집니다.

만약, LastBaseLine이라 적으면 끝에 맞추게 됩니다.

이런 베이스라인을 이용하는 건 Row만 가능합니다.

대신, align같은 경우는 Row, Column, Box 셋 다 가능합니다.

또한 weight으로 가중치를 설정할 수 있습니다.

4-1. Modifier.clip()

그 다음으로 모디파이어의 함수 중 하나인 clip입니다.

해당 함수를 이용하면, 도형을 그릴 수 있습니다.

Modifier.clip(CircleShape)
Modifier.clip(RectangleShape)
Modifier.clip(CutCornerShape)
Modifier.clip(RoundCornerShape)

총 4종류가 소개돼 있는데, Circle은 원, Rectangle은 사각형, CutCorner는 모서리가 각지게 잘려있는 사각형,

RoundCorner는 모서리가 둥글게 잘려있는 사각형입니다.

이걸로 도형을 그리기보다는 간단하게 표현할 때 사용하는 게 좋을 것 같습니다.

🎯 5. 끝

오늘은 이렇게 끝이 났습니다.

아마 다음주 팀 프로젝트 시작 전까지 이렇게 개인적인 공부와 프로젝트를 진행할 것 같습니다.

제가 만들고 싶은 가위바위보도 어느 정도 계획을 잡았으니, 내일은 이걸 재밌게 해볼 생각입니다.

끝.

profile
여기는 공부 기록용 블로그

0개의 댓글