class Solution {//나의 풀이
fun solution(a: Int, b: Int): Int
= if("$a$b".toInt() >= 2*a*b) "$a$b".toInt() else 2*a*b
}
📖두 수의 연산값 비교하기 문제의 다른 사람 풀이
class Solution {//다른 사람 풀이 fun solution(a: Int, b: Int): Int { var answer: Int = 0 val aa = (a.toString() + b.toString()).toInt() answer = aa.coerceAtLeast(a*b*2) return answer } }
- coerceAtLeast 함수를 사용한 방법
- coerceAtLeast : 호출된 객체가 특정 객체보다 큰 지 아닌지 확인하여 호출된 객체가 더 클 경우 객체를 반환, 아니면 최소 객체를 반환.
- coerceAtMost : 호출된 객체가 특정 객체보다 작은지 아닌지를 확인하여 호출된 객체가 더 작은 경우 객체를 반환, 아니면 최대 객체를 반환
- 진짜 처음보는 함수라서 가져왔다. 이 문제에 진짜 적합한 함수 같다.
class Solution {//다른 사람 풀이 fun solution(a: Int, b: Int): Int = maxOf("$a$b".toInt(), 2 * a * b) }
- maxOf를 통해 kotiln.math.* 를 임포트할 필요없이 바로 두 수의 비교가 가능하다.
- max를 사용하려고 하면 보통 임포트해야해서, 뭔가 잘 손이 안갔는데,, maxOf를 보고 살짝. 허망..한 기분? 이런 편리한게 있었다니. maxOf는 뒤에 람다식을 사용해서 여러값중에 가장 큰 값을 반환해주는 함수이기 때문에, 숫자 2개를 1:1 비교하는 것 외에도 활용도가 높은 함수이다.!
class Solution {//나의 풀이
fun solution(num_list: IntArray): Int {
var answer: Int = -1
for(i in num_list){
if(i < 0) {
answer = num_list.indexOf(i)
break
}
}
return answer
}
}
📖첫 번째로 나오는 음수 문제의 다른 사람 풀이 : indexOfFirst를 사용한 풀이
class Solution {//다른 사람 풀이 fun solution(numList: IntArray) = numList.indexOfFirst { it < 0 } }
- indexOfFirst : 람다식에 일치하는 첫 요소의 인덱스를 반환하고, 일치 하는 것이 없으면 -1을 반환한다.
- indexOfLast : 람다식에 일치하는 마지막 요소의 인덱스를 반환하고, 일치하는 것이 없으면 -1을 반환한다.
- indexOf(element:E) : 인자로 받은 요소가 첫 번째로 나타나는 인덱스를 반환하며, 없으면 -1을 반환한다. 람다식 사용 불가능
- lastIndexOf(element:E) : 인자로 받은 요소가 마지막으로 나타나는 인덱스를 반환하고, 없으면 -1을 반환한다. 람다식 사용 불가능
class Solution {//나의 풀이
fun solution(my_string: String): Array<String>
= my_string.split(" ").toTypedArray()
}
class Solution {//나의 풀이
fun solution(my_string: String, is_prefix: String): Int
= if(my_string.startsWith(is_prefix))1 else 0
}
📖접두사인지 확인하기 문제의 다른 사람 풀이
class Solution {//다른 사람 풀이 fun solution(myString: String, isPrefix: String): Int { return if (myString.indices .map { myString.substring(0, it + 1) } .contains(isPrefix)) 1 else 0 } }
- indices를 이용하여 문자열의 인덱스 it을 참조하는 map을 통해 substring으로 앞에서부터 잘라나가면서 isPrefix를 포함하고 있는지 확인하고 있으면 1 없으면 0을 반환한다.
class Solution {//다른 사람 풀이 fun solution(my_string: String, is_prefix: String): Int { var answer: Int = 0 var check = "" my_string.forEach{ check += it.toString() if(is_prefix == check) answer = 1 } return answer } }
- 확인을 위한 빈문자열 check를 만들고, my_string을 forEach로 반복하며 check에 앞에서부터 문자열 하나씩 더해가면서 is_prefix와 동일한 지확인하고 맞으면 1을 answer에 할당하여 반환한다.
class Solution {//나의 풀이
fun solution(num_list: IntArray): Int {
var odd = 0
var even = 0
for(i in num_list.indices){
if(i % 2 == 0) odd += num_list[i]
else even +=num_list[i]
}
return maxOf(odd,even)
}
}
📖홀수 vs 짝수 문제의 다른 사람 풀이 : filterIndexed를 사용한 방법
class Solution {//다른 사람 풀이 fun solution(num_list: IntArray): Int { var odd = num_list.filterIndexed { i, _ -> i % 2 != 0 }.sum() var even = num_list.filterIndexed { i, _ -> i % 2 == 0 }.sum() return if (odd > even) odd else even } }
- filterIndexed{index, i ->} : 인덱스와 요소를 함께 필터링 조건으로 사용할 수 있다.
- 위의 코드에서는 람다식에서 인덱스는 사용하고 있지만, 요소에 대해서 사용하지 않고 있기 때문에 _를 표시하여 사용하지 않는 매개변술을 나타내고 있다.
- num_list.indexOf(it) 이렇게 쓰는게 마음에 걸렸었었다. filterIndexed를 알고서 사용했었다면 머리 속에 그린 대로 문제를 풀 수 있었을텐데..ㅎ 이제라도 알았으니까 다음엔 바보같이 굴지 말아야겠다!
class Solution {//나의 풀이
fun solution(myString: String, pat: String): Int
= if(myString.contains(pat, true)) 1 else 0
}
class Solution {//나의 풀이
fun solution(hp: Int): Int {
var a = hp/5
var b = (hp - a*5)/3
var c = (hp - a*5)%3
return a + b + c
}
}
var b = hp % 5 / 3 var c = hp % 5 % 3를 사용했으면 더더 중복 없고 간결한 식이 되었을 텐데.. 라고 다른 사람 풀이를 보고 알았다. 굳이 일았으면 따로 변수도 사용안하고 그냥 = hp/5 + (hp%5)/3 + (hp%5%3)으로 뚝딱 풀었으면 될 것을.. 하여간 이런건 정말 많이 풀어보는 수밖에 없는 것 같다. 근데 이렇게 쉬운 문제도 이렇게 푼다는게 조금 슬플 뿐이다. ...class Solution {//나의 풀이
fun solution(arr: IntArray, n: Int): IntArray
= arr.mapIndexed{idx,i ->
when(arr.size%2) {
0 -> if(idx%2!=0) i+n else i
else -> if(idx%2 ==0) i+n else i
}
}.toIntArray()
}
class Solution {//나의 풀이
fun solution(todo_list: Array<String>, finished: BooleanArray): Array<String>
= todo_list.filterIndexed{idx, i -> !finished[idx]}.toTypedArray()
}
class Solution {//나의 풀이
fun solution(arr: IntArray): IntArray {
var answer: IntArray = intArrayOf()
for(i in arr){
for(j in 1..i){
answer += i
}
}
return answer
}
}
📖배열의 원소만큼 추가하기 문제의 다른 사람 풀이 : flatMap을 이용한 방법
class Solution {//다른 사람 풀이 fun solution(arr: IntArray): List<Int> { return arr.flatMap { i -> List(i) { i } } } }
- flatMap을 사용하여 길이가 i이면서 요소가 i로 채워지도록 만든 리스트들을 단일리스트로 평면화 시켜서 반환시킨다.
- flatMap : 감싸져있는 Collection을 하나로 합쳐서 배열(또는 iterable)을 반환한다.
- Collection 내부에 Collection이 들어있는 경우, 내부의 Collection을 펼쳐준다.
- map이 무조건 1:1 매핑이라면, flatMap은 1:1뿐만 아니라 1:다 매핑도 가능하다.
- flatMap은 처음 보는 것 같은데, 찾아보니까 사용법이 되게 다양하게 있는 함수이다. 활용도가 높은.. 것 같은데 그만큼 복잡해서 지금 다루기에는 한 눈에 들어오지 않는다. 좀 더 많은 케이스를 배워야 할 것 같다.
class Solution {//나의 풀이
fun solution(numbers: IntArray): Int {
var arr = intArrayOf()
for(i in numbers.indices){
for(j in i+1 until numbers.size){
arr += numbers[i]*numbers[j]
}
}
return arr.maxOf{it}
}
}
numbers.sorted().takeLast(2).reduce{result, i -> result*i} 라고 코드를 적었다. 정렬해서 제일 큰 숫자 2개끼리 곱하면 되니까. 근데 이 배열에는 음수가 있기 때문에.. 음수끼리 곱하면 양수가 되니까.. 최대값이 꼭 맨 뒤에 값 2개 곱한다고 나오지가 않는 것이다...... 그래서 무슨 생각을 했냐면.. 아. 결국 다 곱한 값들 중에서 최대값을 찾아야 하네 라고 생각해서 이중 for문을 만들었다. 근데 이게 바보같았다는 것을 다른 사람 풀이 보고 알았는데... 어짜피 sorted( ) 하면 제일 작은 수부터 정렬하기 때문에 음수는 절댓값이 클수록 작은거니까 만약 음수 두개를 곱해서 최대값을 만들더라도 제일 앞의 두수만 곱하면 되는 거였다. 그니까 굳이 전부 다 곱해서 최대값을 찾지 않더라도, maxOf(numbers.sorted().take(2).reduce{result, i -> result*i}, numbers.sorted().takeLast(2).reduce{result, i -> result*i})를 통해서 최댓값을 구할 수 있던 거였지.ㅎ 반성의 의미로 기록하기 위해 가져왔다.