문자열에서 특정문자를 다른문자로 바꾸는 메서드
예시)
fun solution(s: String): Int = s
.replace("one", "1")
.replace("two", "2")
.replace("three", "3")
.replace("four", "4")
.replace("five", "5")
.replace("six", "6")
.replace("seven", "7")
.replace("eight", "8")
.replace("nine", "9")
.replace("zero", "0")
.toInt()
fun solution(s: String): Int {
var replaceMap = mapOf("one" to "1", "two" to "2" , "three" to "3" , "four" to "4" , "five" to "5" ,
"six" to "6" , "seven" to "7" , "eight" to "8" , "nine" to "9" , "zero" to "0" )
var answer = s
for ((key, value) in replaceMap){
answer = answer.replace(key, value)
}
return answer.toInt()
}
이건 매핑해서 바꿔준것
그냥 sort()는 오름차순으로 정렬하는거라면
sortedBy { arr[n] } n번째 문자를 기준으로 정렬시킬수 있다
배열에서 쓰인다
fun solution(strings: Array<String>, n: Int) = strings.sortedBy { it[n] }.toTypedArray()
fun solution(strings: Array<String>, n: Int): Array<String> {
return strings.also {
it.sort()
it.sortBy { it[n] }
}
}
val list = listOf("apple", "banana", "orange")
val sortedList = list.sortedBy { it.length }
sortedWith 함수는 Kotlin에서 리스트를 정렬할 때 사용되는 함수이다.
함수는 비교 기준을 정의하는 함수를 인자로 받는다.
이 함수는 두 요소를 비교하고, 첫 번째 요소가 두 번째 요소보다 작으면 음수, 같으면 0, 크면 양수를 반환한다.
이 반환값에 따라 정렬이 이루어진다
fun main() {
val matrix = arrayOf(
arrayOf(3, 1, 4),
arrayOf(1, 5, 9),
arrayOf(2, 6, 5)
)
val col = 0 // 첫 번째 열을 기준으로 정렬
val sortedMatrix = matrix.sortedWith(compareBy { it[col] })
// 결과 출력
sortedMatrix.forEach { row ->
println(row.joinToString(", "))
}
}
1, 5, 9
2, 6, 5
3, 1, 4 //결과
sortedBy랑 뭐가 다름?
예를 들어 약수의 갯수를 구하는 measure이란 함수가 있는데
With는 외부함수도 사용해서 비교할 수 있지만 By는 키를 기반으로 하기때문에 외부함수를 사용하는게 불가능하다
리스트의 일부 요소를 잘라내 새로운 리스트를 생성한다
여러구간을 나누는것도 가능하다
val list = listOf(1, 2, 3, 4, 5)
val subList = list.slice(1..2, 3..4) // [2, 3, 4, 5]
이건 배열의 일부를 잘라낸다
중복값제거
Map에서 사용되는 함수
맵에 지정된 키가 있는지 찾는다
예)
fun solution(s: String): IntArray {
var answer = IntArray(s.length) { -1 }
var arr = s.toCharArray()
var lastIndex = mutableMapOf<Char, Int>()
for (i in arr.indices) {
if (lastIndex.containsKey(arr[i])) {
answer[i] = i - lastIndex[arr[i]]!!
}
lastIndex[arr[i]] = i
}
return answer
}
lastIndex 지난 문자에 지금 새로운 문자 arr[i]가 있는지 확인해주는 코드
true or false로 값을 반환한다
배열 또는 리스트에서 특정 요소의 마지막 인덱스를 반환하는 함수
해당요소가 없다면 -1을 반환한다
fun solution(s: String): List<Int> {
return s.withIndex().map{(i,w) ->
s.slice(0 until i).lastIndexOf(w).let{
if(it >= 0) i-it else it }
}
}
fun main() {
val numbers = arrayOf(1, 2, 3, 4, 5, 2, 6, 7, 8, 2)
val lastIndex = numbers.lastIndexOf(2)
if (lastIndex != -1) {
println("Last index of 2: $lastIndex")
} else {
println("2 not found in the array.")
}
}
주어진 횟수만큼 특정블록을 반복한다
for (i in 1 until food.size) {
// food[i] / 2 만큼 반복하여 리스트에 i 추가
repeat(food[i] / 2) {
foodList.add(i)
}
한 컬렉션의 모든 요소를 다른 컬렉션에 추가하는 데 사용한다
for (i in 1 until food.size) {
// 반복 횟수만큼 바로 추가하도록 변경
foodList.addAll(List(food[i] / 2) { i })
}
크기가 food[i] / 2인 리스트를 만들고 각 요소에 { } 블록의 결과를 넣는다
LocalDate.of(year, month, day)로 구성되어 있고
날짜를 나타내는 LocalDate
날짜의 요일을 나타낸다
date.dayOfWeek.toString() 이런식으로 사용하며 toString을 안쓰면 숫자로 나타낸다
// 구성
enum class DayOfWeek(val value: Int) {
MONDAY(1),
TUESDAY(2),
WEDNESDAY(3),
THURSDAY(4),
FRIDAY(5),
SATURDAY(6),
SUNDAY(7)
}
컬렉션에서 조건을 만족하는 요소가 하나라도 있는지 검사한다
val numbers = listOf(1, 2, 3, 4, 5)
val result = numbers.any { it > 3 }
println(result) // 출력: true (3보다 큰 요소가 하나 이상 있음)
컬렉션의 각요소를 인덱스와 람다 식을 적용해 새로운 컬렉션을 생성한다
fun solution(k: Int, m: Int, score: IntArray): Int {
return score.sortedDescending()
.mapIndexed { i, v -> if (i % m == m - 1) v else 0 }.sum() * m
}
여기선 내림차순으로 정렬된 score의 요소를 {인덱스, 요소값 -> 조건문을 이용해 값을 변환}시켜 배열을 생성했다
for (i in 0 until x.size) == for (i in x.withIndex())
코드를 간결하게 해준다
컬렉션에서 각요소에 대해 주어진 람다함수를 실행하면서 인덱스를 전달함
mapIndexed처럼 새운 컬렉션을 생성하진 않고 원본 컬렉션은 유지하면서 특정작업을 한다
val numbers = mutableListOf(1, 2, 3, 4, 5)
numbers.forEachIndexed { index, value ->
numbers[index] = index * value
}
컬렉션의 각 요소에 대한 반복문을 제공한다
코드를 좀더 간결하게 해주는 도구
fun solution(n: Int, m: Int, section: IntArray): Int {
var count = 0
var end = 0
section.forEach { if (it > end) { end = it + m - 1; count++ } }
return count
}
for (i in section)의 반복문을 고쳐준것
컬렉션의 각 요소에 대해 주어진 람다 함수를 순서대로 적용하면서 누적 값을 생성한다
이 함수는 초기 누적 값(initial accumulator)을 제공하고, 각 요소를 순회하면서 람다 함수를 호출하여 누적 값을 갱신한다
fun solution(n: Int, m: Int, section: IntArray) = section.fold(0 to 0) {
(count, end), s -> if (s > end) count + 1 to s + m - 1 else count to end }.first
이 예제에선 pair로 count와 end를 초기값 0 인채로 폴드했고 배열 section의 각요소들을 순회하면서 count와 end값을 변경 해준다
뒤에 .first를 써 (count, end)중 첫번째에 있는 count의 값을 반환하게된다