어떤 정수들이 있습니다. 이 정수들의 절댓값을 차례대로 담은 정수 배열 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 }
}
프로그래머스 모바일은 개인정보 보호를 위해 고지서를 보낼 때 고객들의 전화번호의 일부를 가립니다. 전화번호가 문자열 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)}"
}
}
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()
}
정수를 저장한 배열, 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()
}
단어 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 입력된 요소 한에)