Kotlin/TIL

TIL 6 (01.26)

내손은개발 🐾 2024. 1. 26. 18:16
CodeKata

 

1. 음양 더하기

어떤 정수들이 있습니다. 이 정수들의 절댓값을 차례대로 담은 정수 배열 absolutes와 이 정수들의 부호를 차례대로 담은 불리언 배열 signs가 매개변수로 주어집니다. 실제 정수들의 합을 구하여 return 하도록 solution 함수를 완성해주세요. 

 

내 생각 :  for문을 돌려 해당 index가 true면 더하고 false면 빼면 될 것 같다.

// 내 풀이
class Solution {
    fun solution(absolutes: IntArray, signs: BooleanArray): Int {
        var answer: Int = 0

        for (i in 0 until absolutes.size) {
            if (signs[i]) {
                answer += absolutes[i]
            } else {
                answer -= absolutes[i]
            }
        }
        return answer
    }
}​

 

//다른 사람의 풀이
class Solution {
fun solution(absolutes: IntArray, signs: BooleanArray) = absolutes.foldIndexed(0) { index, acc, i -> if (signs[index]) acc + i else acc - i }
}

 

 

 

2. 핸드폰 번호 가리기

프로그래머스 모바일은 개인정보 보호를 위해 고지서를 보낼 때 고객들의 전화번호의 일부를 가립니다.
전화번호가 문자열 phone_number로 주어졌을 때, 전화번호의 뒷 4자리를 제외한 나머지 숫자를 전부 *으로 가린 문자열을 리턴하는 함수, solution을 완성해주세요.

 

 

내 생각 :  코린이로써는 코드가 길어지겠지만 단순히 문제를 풀어야겠다고 생각하여서 

string의 size를 구한뒤에 4를 뺀수만큼 *로 바꾸는 형식으로 풀어야겠다고 생각했다.

//내 풀이
class Solution {
    fun solution(phone_number: String): String {
        var answer = ""
        val nSize = phone_number.length - 4
        var cnt = 0

        for (i in 0 until nSize) {
            answer += '*'
        }
        for (i in nSize until nSize + 4) {
            answer += phone_number[i]
        }
        return answer
    }
}​

 

쓰다보니 내가봐도 배드코드이다 ,,,, for문을 두번이나 썼어야했을까?
다른 사람 풀이를 보기 전에 for문부터 1개로 줄이고 봐야겠다.
//내 풀이2
class Solution {
    fun solution(phone_number: String): String {
        var answer = ""
        val nSize = phone_number.length - 4
        var cnt = 0

        for (i in 0 until phone_number.length) {
            if (i < nSize) {
                answer += '*'
            } else {
                answer += phone_number[i]
            }
        }

        return answer
    }
}​
//다른 사람의 풀이
class Solution {
    fun solution(phone_number: String): String {
        return "${"".padStart(phone_number.length - 4, '*')}${phone_number.takeLast(4)}"
    }
}

 

 

3. 없는 숫자 더하기

0부터 9까지의 숫자 중 일부가 들어있는 정수 배열 numbers가 매개변수로 주어집니다. numbers에서 찾을 수 없는 0부터 9까지의 숫자를 모두 찾아 더한 수를 return 하도록 solution 함수를 완성해주세요.

 

 

내 생각 : 0-9까지 들어있는 배열을 만들고 numbers와 비교하여 없으면 += 으로 return

음... not in을 여기서는 어떻게 쓰는지 찾아봐야겠다.

-> in과 contains()를 찾았는데 not in은 어떻게 쓰는지 모르겠다. Codekata끝나고 찾아봐야겠다.

 

// 내 풀이
class Solution {
    fun solution(numbers: IntArray): Int {
        var answer: Int = 0
        var arr = intArrayOf()

        for (i in 0..9) {
            arr += i
        }
        for (i in arr) {
            if (i in numbers) {
                continue
            } else {
                answer += i
            }
        }

        return answer
    }
}​


//다른 사람의 풀이
class Solution {
    fun solution(numbers: IntArray): Int  = 45 - numbers.sum()
}
// 2
class Solution {
    fun solution(numbers: IntArray): Int = (0..9).filterNot(numbers::contains).sum()
}​
이렇게 쉬운 방법이 !!,,,

 

 

4. 제일 작은 수 제거하기

정수를 저장한 배열, arr 에서 가장 작은 수를 제거한 배열을 리턴하는 함수, solution을 완성해주세요. 단, 리턴하려는 배열이 빈 배열인 경우엔 배열에 -1을 채워 리턴하세요. 예를들어 arr이 [4,3,2,1]인 경우는 [4,3,2]를 리턴 하고, [10]면 [-1]을 리턴 합니다.

 

내 생각 : min 사용해서 빼기, 예외처리 하기

 

//내 풀이
class Solution {
    fun solution(arr: IntArray): IntArray {
        var answer = intArrayOf()

        answer = arr.filter { it != arr.minOrNull() }.toIntArray()

        if (answer.isEmpty()) answer += -1

        return answer
    }
}​


//다른 사람의 풀이
class Solution1 {
    fun solution(arr: IntArray): IntArray =
        if (arr.size == 1) intArrayOf(-1) else arr.filter { it != arr.min() }.toIntArray()
}​

 

5. 가운데 글자 가져오기

단어 s의 가운데 글자를 반환하는 함수, solution을 만들어 보세요. 단어의 길이가 짝수라면 가운데 두글자를 반환하면 됩니다.

 

내 생각 : 글자 수가 짝수/홀수인지 체크하고 가운데 출력(짝수 = 가운데 2개 / 홀수 = 가운데 1개)

 

// 내 풀이
class Solution {
    fun solution(s: String): String {
        var answer = ""
        val s_len = s.length

        if (s_len % 2 == 0) {
            for (i in s_len / 2 - 1..s_len / 2) {
                answer += s[i]
            }
        } else {
            answer += s[s_len / 2]
        }

        return answer
    }
}​

//다른 사람의 풀이
class Solution {
    fun solution(s: String) = s.slice(((s.length - 1) / 2)..(s.length / 2))
}​
slice

 

 


 

강의

 

ViewBinding

 - 뷰와 상호작용하는 코드를 쉽게 작성할 수 있다. ~.. ~ 바인딩 클래스의 인스턴스에는 상응하는 레이아웃에 ID가 있는 모든 뷰의 직접 참조가 포함된다. 대부분의 경우 ViewBinding이 findViewById를 대체한다. -공식문서

 

 - 그러면 왜/어쩔때 사용되나 ?

findViewById를 사용해서 가져올 경우 해당 layout이 아니라 다른 layout의 ui요소를 가져올 수 있어서 가져오게 되면 NullException 에러가 난다.

대신 binding으로 가져올 경우에는 해당 layout의 요소만 떠서 아예 뜨지도 않는다. 이렇게되면 findViewById로 잘못가져오는 NullPointException의 에러를 방지함과 동시에 해당 ui요소에서 id값들을 바로 가져올 수 있어서 따로 ui요소의 id를 외우지 않더라도 쉽게 가져올 수 있는 장점이 있다.

 

사용법
1. 먼저 app수준의 build.gradle에서 viewBinding을 true로 두고 sync해준다.
(android { 안에 넣어 준다)
2. mainActivity
class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding //

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater) //
        setContentView(binding.root)​


3. 까지 완료했으면 편하게 layout에서 입력한 ui 요소들을 binding. 으로 가져올 수 있다.(id 입력된 요소 한에)

 

 

뷰 결합  |  Android 개발자  |  Android Developers

뷰 결합 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 뷰 결합 기능을 사용하면 뷰와 상호작용하는 코드를 쉽게 작성할 수 있습니다. 모듈에서 사용 설정

developer.android.com

 

'Kotlin > TIL' 카테고리의 다른 글

TIL 8 (02.01)  (0) 2024.02.01
TIL 7 (01.29)  (0) 2024.01.29
TIL 5 (01.25)  (1) 2024.01.25
TIL 4 (01.24)  (0) 2024.01.24
TIL 3 (01.23)  (1) 2024.01.23