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 } }
slice//다른 사람의 풀이 class Solution { fun solution(s: String) = s.slice(((s.length - 1) / 2)..(s.length / 2)) }
강의
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 입력된 요소 한에)
'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 |