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 |