문법 정리

replace()

문자열에서 특정문자를 다른문자로 바꾸는 메서드

  • replace(바꾸고싶은내용, 바꾸려는내용)으로 사용한다

예시)

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()
}

이건 매핑해서 바꿔준것

sortedBy

그냥 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

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랑 뭐가 다름?

  • sortedBy는 특정 키를 기반으로 정렬하는 데 사용되며, 키를 계산하는 람다를 제공함
  • sortedWith는 Comparator를 사용하여 정렬하는 데 사용되며, 비교자를 직접 지정할 수 있다

예를 들어 약수의 갯수를 구하는 measure이란 함수가 있는데

With는 외부함수도 사용해서 비교할 수 있지만 By는 키를 기반으로 하기때문에 외부함수를 사용하는게 불가능하다

slice

리스트의 일부 요소를 잘라내 새로운 리스트를 생성한다

여러구간을 나누는것도 가능하다

val list = listOf(1, 2, 3, 4, 5)
val subList = list.slice(1..2, 3..4) // [2, 3, 4, 5]

sliceArray

이건 배열의 일부를 잘라낸다

distinct()

중복값제거

containsKey()

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로 값을 반환한다

lastIndexOf()

배열 또는 리스트에서 특정 요소의 마지막 인덱스를 반환하는 함수

해당요소가 없다면 -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.")
    }
}

repeat()

주어진 횟수만큼 특정블록을 반복한다

for (i in 1 until food.size) {
        // food[i] / 2 만큼 반복하여 리스트에 i 추가
        repeat(food[i] / 2) {
            foodList.add(i)
        }

addAll()

한 컬렉션의 모든 요소를 다른 컬렉션에 추가하는 데 사용한다

for (i in 1 until food.size) {
        // 반복 횟수만큼 바로 추가하도록 변경
        foodList.addAll(List(food[i] / 2) { i })
    }

크기가 food[i] / 2인 리스트를 만들고 각 요소에 { } 블록의 결과를 넣는다

LocalDate.of()

LocalDate.of(year, month, day)로 구성되어 있고

날짜를 나타내는 LocalDate

dayOfWeek

날짜의 요일을 나타낸다

date.dayOfWeek.toString() 이런식으로 사용하며 toString을 안쓰면 숫자로 나타낸다

// 구성
enum class DayOfWeek(val value: Int) {
    MONDAY(1),
    TUESDAY(2),
    WEDNESDAY(3),
    THURSDAY(4),
    FRIDAY(5),
    SATURDAY(6),
    SUNDAY(7)
}

any

컬렉션에서 조건을 만족하는 요소가 하나라도 있는지 검사한다

val numbers = listOf(1, 2, 3, 4, 5)

val result = numbers.any { it > 3 }

println(result) // 출력: true (3보다 큰 요소가 하나 이상 있음)

mapIndexed

컬렉션의 각요소를 인덱스와 람다 식을 적용해 새로운 컬렉션을 생성한다

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의 요소를 {인덱스, 요소값 -> 조건문을 이용해 값을 변환}시켜 배열을 생성했다

withIndex

for (i in 0 until x.size) == for (i in x.withIndex())

코드를 간결하게 해준다

forEachIndexed

컬렉션에서 각요소에 대해 주어진 람다함수를 실행하면서 인덱스를 전달함

mapIndexed처럼 새운 컬렉션을 생성하진 않고 원본 컬렉션은 유지하면서 특정작업을 한다

val numbers = mutableListOf(1, 2, 3, 4, 5)

numbers.forEachIndexed { index, value ->
    numbers[index] = index * value
}

forEach

컬렉션의 각 요소에 대한 반복문을 제공한다

코드를 좀더 간결하게 해주는 도구

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)의 반복문을 고쳐준것

fold

컬렉션의 각 요소에 대해 주어진 람다 함수를 순서대로 적용하면서 누적 값을 생성한다
이 함수는 초기 누적 값(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의 값을 반환하게된다

0개의 댓글