본문 바로가기
코딩테스트

[프로그래머스] 가까운 수

by liz_devel 2025. 12. 22.

🗒 문제


📝 나의 문제풀이

class Solution {
    fun solution(array: IntArray, n: Int): Int {

        return array.minWithOrNull(compareBy(
            {kotlin.math.abs(it - n)}, {it}))!!

    }
}

📝 다른 사람의 문제 풀이

다른 사람의 문제 풀이는 좋아요 수가 높거나 많은 사람들이 푼 방법 기준으로 첨부하였습니다.

class Solution {
    fun solution(array: IntArray, n: Int): Int =
    array.sortedWith(compareBy<Int> { Math.abs(it - n) }
        .thenBy { it })
        .first()

🖊 문제 풀이 시 알면 좋을 것

 

minWithOrNull

  • 컬렉션(리스트, 배열 등)에서 최소값을 찾아주는 함수
  • 그냥 최소값이 아니라, **비교 기준(comparator)**을 지정해서 찾을 수 있음
  • 값이 없을 수 있으므로 null 가능 → 필요하면 !!로 null 아님 단언

기본 예시

val numbers = listOf(5, 3, 8)
val minNumber = numbers.minWithOrNull(compareBy { it }) // 그냥 숫자 기준
println(minNumber) // 3

 

  • 여기서 compareBy { it } = 그냥 값 그대로 비교
  • 결과: 3 → 최소값

비교 기준 바꾸기

val numbers = listOf(5, 3, 8, 3)
val minNumber = numbers.minWithOrNull(compareBy { it % 2 }) 
println(minNumber) // 8

 

 

  • 기준: it % 2 → 짝수(0) 먼저, 홀수(1) 나중
  • 최소값 = 짝수 중 가장 작은 것

compareBy

  • 정렬이나 최소/최대 비교 기준을 정의할 때 사용
  • compareBy({ 기준1 }, { 기준2 })처럼 여러 기준도 가능

예시: 두 기준 사용

val numbers = listOf(10, 16, 11, 12)
val n = 13

val closest = numbers.minWithOrNull(compareBy({ kotlin.math.abs(it - n) }, { it }))
println(closest) // 12

 

단계별 계산

원소 abs(it - n) 비교 기준 (튜플)
10 3 (3, 10)
16 3 (3, 16)
11 2 (2, 11)
12 1 (1, 12)
  • 최소값 = (1, 12) → 반환값 12
  • 비교 순서: 첫 번째 요소 기준 → 최소 (1, 12) 선택
  • 리턴값: 12 (원래 원소)
  • 기준값 튜플은 비교용일 뿐, 실제 리턴되는 값은 원소 자체
반응형