Kotlin/TIL

TIL 5 (01.25)

내손은개발 🐾 2024. 1. 25. 17:55
CodeKata

 

1. 하샤드 수

 

문제를 보고 2가지 방법을 생각했다.

1) 자릿수를 10으로 나눠서 더한 뒤 결과

2) string으로 바꾼뒤 더한 뒤 결과

 

(파이썬이였으면 string으로 바꾼뒤 리스트에 넣고 다시 int로 바꿔 리스트의 sum을 구했을 것이다.)

 - 2가지 방법 모두 사용해 봐야겠다.)

 

class Solution1 {
    fun solution(x: Int): Boolean {
        var sum = 0
        var x_1 = x
        
        while(x_1 != 0){
            sum += x_1 % 10
            x_1 /= 10
        }
        return (x % sum == 0)
    }
}

1)번의 방법

class Solution2 {
    fun solution(x: Int): Boolean {
        val x_arr = x.toString().toCharArray()
        var sum = 0

        for (i in x_arr){
            sum += i.toString().toInt()
        }

        return x % sum == 0
    }
}

2)번의 방법

 

뭔가 더 간결하게 사용할 수 있을 것 같은데,,,, 아직 코린이라 이렇게 까지만

음,, 둘다 사용하기에는 비슷하다(?) 그럴땐 역시 다른 사람의 풀이를 보고 간결한 걸 찾아보자

 

class Solution {
    fun solution(x: Int): Boolean {
        return x % x.toString().fold(0){acc, c -> acc + c.toInt() - 48} == 0
    }
}

 

아스키코드 사용해서 푼게 제일 간결해 보인다. 음..그래..음

 

2. 두 정수 사이의 합

 

어렵다고 생각이 안드는 문제이다

class Solution {
    fun solution(a: Int, b: Int): Long {
        var sum = 0
        var a_num = a
        var b_num = b
        if (b<a) {
            a_num = b
            b_num = a
        }
        for (i in a_num..b_num) {
            sum += i
        }
        return sum.toLong()
    }
}

 

??? : 어렵다고 생각이 안드는 문제이다.

 

실행 결과로 테스트케이스에서 반 이상이 틀렸다.

아무리 봐도 깔끔하게는 풀지는 않았지만 왜 틀리지라는 생각뿐

-> 찾아보니 나중에 결과에서 int를 long으로 변환해서 틀렸다고 한다...

3번째 줄 ) var sum: Long = 3  , 마지막 return = sum 수정 후 제출

처음부터 하는거랑 계산후 나중에 바꿀 때 무슨 문제가 있는건가?

 

 

3. 콜라츠 추측

조건
1-1. 입력된 수가 짝수라면 2로 나눕니다.
1-2. 입력된 수가 홀수라면 3을 곱하고 1을 더합니다.
2. 결과로 나온 수에 같은 작업을 1이 될 때까지 반복합니다.
class Solution {
    fun solution(num: Int): Int {
        var cnt = 0
        var n = num

        while (n!= 1){
            cnt += 1
            if (cnt == 500){
                return -1
            }
            if (n %2 == 0){
                n /=2
            }else{
                var temp = n.toDouble()
                temp = (temp * 3) + 1
                n = temp.toInt()
            }
        }
        return cnt
    }
}

문제에서 나오는대로 풀었다. 다른 사람 풀이를 보고 밑에 tailrec이라는 꼬리재귀를 알게 되었다.

 

4. 서울에서 김서방 찾기

 

class Solution {
    fun solution(seoul: Array<String>): String {
        var answer = seoul.indexOf("Kim")
        return "김서방은 ${answer}에 있다"
    }
}

 

이 문제는 어렵지 않게 풀었다. 대신 한줄로 줄여쓸 수 있는 연습이 필요하다고 느꼈다.

//다른 사람의 풀이
class Solution {
    fun solution(seoul: Array<String>): String = "김서방은 ${seoul.indexOf("Kim")}에 있다"
}

 

 

5. 나누어 떨어지는 숫자 배열

 

mutableList로 바꿔서 add로 넣고 sort해야겠다고 생각해서 작성

class Solution {
    fun solution(arr: IntArray, divisor: Int): IntArray {
        var arr1 = mutableListOf<Int>()
        for (i in arr) {
            if (i % divisor == 0) {
                arr1.add(i)
            }
        }
        if (arr1.size == 0) {
            arr1.add(-1)
        }
        arr1.sort()
        return arr1.toIntArray()
    }
}

 

성공

 

//다른 사람의 풀이
class Solution {
    fun solution(arr: IntArray, divisor: Int): IntArray {
        var answer = intArrayOf()

        arr.forEach { if (it % divisor == 0) answer += it }
        answer.sort()

        if (answer.size == 0) answer += -1

        return answer
    }
}

 

아하 저번에 정리하면서 내가 잘못 이해한 점이 있었다. array와 list, ArrayList 등 배열을 다시 정리해야겠다.

 

 

강의

 

1. intent의 flag

 

3주차 마지막 강의(mbtiTest)에서 검사가 끝난 후 다시하기 버튼을 눌러 MainActivity화면으로 넘어갈때 intent의 flag를 사용해서 초기화 한 후 넘어갔다. intent의 flag의 종류와 사용법을 정리해보았다.

 

오늘 사용한 코드
사용한 코드

 

 

Activity Intent Flag란 ?

 - Activity의 중복 문제나 흐름을 제어하고 싶을 때 사용한다.

 - 사용방법으로는 Manifest에서 설정하거나 코드에서 intent.addflag / intent.flags를 사용할 수 있다.

 

소스코드에서 사용하는 방법만 정리

FLAG_ACTIVITY_CLEAR_TOP
 - 호출하려는 activity가 스택에 존재하면, 해당 activity를 최상위로 올리면서 그 위에 존재하던 액티비티를 전부 삭제한다.
FLAG_ACTIVITY_SINGLE_TOP
- top activity와 동일한 activity 실행 시, 해당 activity를 다시 생성하지 않고 기존의 top activity 재사용
FLAG_ACTIVITY_NO_HISTORY
 - activity가 스택에 쌓이지 않도록 한다.
참고

 

 

 

 

 

 

 

MBTI 검사 앱 - 예제 결과

 

 

 

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

TIL 7 (01.29)  (0) 2024.01.29
TIL 6 (01.26)  (1) 2024.01.26
TIL 4 (01.24)  (0) 2024.01.24
TIL 3 (01.23)  (1) 2024.01.23
TIL 2 (01.22)  (0) 2024.01.22