오늘 아침은 왠지 모르게 피곤했습니다...
자기 전에 핸드폰 보는 습관을 줄여야겠습니다.
아침 데일리 스크럼을 하고, 내일 있을 프로젝트 발표 준비를 했습니다. 이후, 코드 카타를 하면서 오전을 보냈습니다.
오후에는 발표 PPT를 만들었고, 2주차 특강 로또 번호 생성기 만드는 강의를 들었습니다.
로또 당첨되고 싶으니까 시간날 때 이걸로 번호 뽑아서 한번 사봐야겠네요.
마지막으로 Kotlin을 복습했습니다. 이전에는 정말 무언가에 쫓기듯 공부했는데, 오늘은 궁금한 거 있으면
찾아보고, 직접 한 번씩 쳐보면서 공부해서 더 좋았습니다.
저희 팀은 PPT를 만들어 발표를 준비했는데요. 각자 맡은 부분은 각자 만들고 발표를 준비하기로 했습니다.
그래서 저는 웹 PPT를 켜서 만들고 있었는데...

세상에 PPT도 협업하는 사이트가 있더라고요. 팀원분이 알려주셔서 다행이었습니다.
저는 PPT 디자인을 정말 못해서 백지에다가 글 쓰고 사진 올리는 거밖에 못하거든요.
어쨌든 해당 사이트에서 팀원들과 함께 PPT를 제작하며, 발표를 준비했습니다.
앞으로 저 사이트는 많이 이용할 것 같네요.
오늘의 코드 카타는 둘만의 암호입니다.
제가 쓴 답은 아래와 같습니다.
class Solution {
fun solution(s: String, skip: String, index: Int): String {
var answer: String = ""
for(i in 0..s.length - 1) {
var c:Char = s[i]
repeat(index) {
if(c.toInt() < 'z'.toInt()) c = (c.toInt() + 1).toChar()
else c = (c.toInt() + 1 - 26).toChar()
while(skip.indexOf(c) > -1) {
if(c.toInt() < 'z'.toInt()) c = (c.toInt() + 1).toChar()
else c = (c.toInt() + 1 - 26).toChar()
}
}
answer += c.toString()
}
return answer
}
}
오늘 코드 카타 하면서 느낀 점은 역시 예전보다 좀 더 익숙해지고, 실력도 는 것 같습니다. 물론, Kotlin의 다양한 문법들을 공부하면서 좀 더 쉬워진 느낌도 있지만, 이전처럼 하나만 생각하는 마인드를 버리고, 계속해서 문제 해결하려고 고민한다는 게 예전과 달라진 점이고, 그덕에 더 잘 푸는 것 같습니다.
내배캠 Android 개발 종합반 강의를 보면 다 재밌는 주제들인 것 같아서 좋습니다.
저번엔 BMI 계산기를 만들어서 캠프 참가 전후의 몸무게를 잴 수 있게 해주시고,
이번엔 로또 번호 생성기를 만들어서 돈 많이 벌 수 있는 수단을 제공해주셨어요.
먼저 화면부터 볼게요.
자동으로 6개의 숫자를 뽑아주는데, 제가 직접 숫자를 정해서 고정으로 나오게 할 수도 있습니다.
그리고 저는 그 기능을 구현하는 코드에 눈길이 갔습니다.
private fun getRandom(): List<Int> {
val numbers = (1..45).filter {it !in pickNumberSet}
return (pickNumberSet + numbers.shuffled().take(6-pickNumberSet.size)).sorted()
}
제가 주목한 부분은 filter, shuffled, take, sorted 입니다.
이 함수들은 컬렉션의 확장함수로, numbers와 return되는 List에 적용되는데요.
(1..45).filter {it !in pickNumberSet}
먼저 filter는 조건에 맞게 걸러주는 필터 역할을 합니다.
위의 경우는 !in pickNumberSet이기 때문에, numbers에서 pickNumberSet에 있는 값을 걸러줍니다.
numbers.shuffled()
shuffled()는 카드를 셔플하는 것처럼 컬렉션 내의 값을 섞어줍니다.
.take(6-pickNumberSet.size))
take()는 1번째부터 인자로 온 Int 값 번째까지만을 반환합니다.
.sorted()
이건 오름차순으로 정렬하는 함수인데, - 값의 인자를 넣어주면 내림차순으로 바뀐다고 합니다.
그리고, sort()라는 함수도 있는데... 4-2에 계속
사실 저는 이전에 Kotlin을 독학한 적 있습니다.
정보처리기사 필기 시험이 끝나고, 3월동안 Kotlin을 공부했었는데요.
처음 Kotlin을 보다보니까 낯선 게 좀 있더라고요.
예를 들어, 문장 끝에 ;가 오지 않는다든지 if문이 아니라 if식이라든지 하는 내용들이요.
아무래도 1번만에 모든 내용을 익히는 건 어렵겠죠.
그래서 실기 시험이 끝나고 5월동안 안드로이드 Jetpack Compose를 공부하면서 같이 복습했었습니다.
처음 읽고 이해 안 가던 부분들이 점차 이해가 가더라고요.
이제는 이해 못하는 것보다도 모르는 구문이 문제가 됐습니다.
저는 손으로는 Kotlin 구문을 치지만, 머릿속으로는 대학교에서 배운 C, Java를 생각하면서 알고리즘을 풀고 있었어요.
모든 기능을 제 손으로 직접 빚어내면서요.
하지만, 캠프 참가하고 코드 카타를 진행하면서,
내가 왜 이 기능들을 안 썼을까
하고 후회가 되더라고요.
그래서 다시 한번 복습을 하게 됐습니다.
코틀린은 물론, val, var로 나눠지는 변수 선언도 특이하지만 이 부분은 넘기겠습니다. 너무 많이 봤어요...
코틀린에서는 함수가 좀 특이합니다. 저한테는 그랬어요.
fun 함수명() {
return ~~~
}
fun 함수명() = ~~~
바로 1줄짜리 내용은 =으로 대체해서 사용할 수 있다는 겁니다.
심지어 return이 있으면 생략할 수도 있어요.
val 변수명 = if() 값1 else 값2
그리고 if는 문이 아니라 식입니다. 그래서, 위처럼 if를 = 뒤에 써줄 수 있죠.
"$변수명"
"${변수명}
그리고 문자열 내에 $를 써서 변수를 바로 써줄 수 있습니다.
"""문자열"""
또한, 절대적인 문자열을 만들어줄 수도 있습니다. 저기에 어떤 게 들어가든 그냥 문자열로 처리해줍니다.
for(변수 in 범위)
반복문은 좀 복잡했던 C, Java와 달리 변수가 범위에 있는지만 확인하고 자동으로 1씩 올려줍니다.
뒤에 step을 적어서 올라가는 숫자를 변경할 수도 있고요.
여기서 모든 컬렉션들과 확장함수는 쓰지 않을 겁니다. 가장 기본적인 List부터 살펴볼게요.
val 변수명 : List<타입> = listOf()
이렇게 타입의 값들을 가진 List를 만들 수 있습니다. List는 순차 컨테이너 타입입니다.
순차적으로 값을 담을 수 있습니다.
val 변수명 : MutableList<타입> = mutableListOf()
초기화 이후 값을 추가해주려면 List가 아닌 MutableList 타입으로 지정해주면 됩니다.
다른 컬렉션들도 동일하게 mutable을 앞에 붙여주면 가변 컬렉션이 됩니다.
val 변수명 : Set<타입> = setOf()
Set은 집합입니다. 중복된 값은 가질 수 없어요. 대신, 집합으로써 기능을 합니다.
Set변수1.union(Set변수2)
Set변수1.subtract(Set변수2)
Set변수1.intersect(Set변수2)
각각 합집합, 교집합, 차집합을 구하는 방법입니다.
val 변수명 : Map<K, V> = mapOf()
다음은 Map입니다. Map은 키와 값의 순서쌍을 가진 컬렉션입니다.
키를 갖고 값을 찾기 되게 좋을 것 같습니다. 여기에 값을 넣어주는 방식이 저는 신기했는데요.
Map변수.add(키 to 값)
이렇게 키 to 값 형식으로 넣어줍니다.
.sort()
그래서 sort는 뭔데?
sort는 정렬입니다. 근데 sorted와 다르게 그냥 그 컬렉션을 바로 정렬해줘요.
그래서 반환해주는 sort보다는 sorted를 더 권장합니다.
오늘은 프로젝트가 끝나서 제 개인적인 공부를 많이 할 수 있어 좋은 시간이었습니다.
내일 발표가 있는데 잘 마쳤으면 좋겠네요.
끝.
참고 자료