[내일배움캠프 13일차] 가까운 수 찾기 알고리즘

NH·2025년 3월 19일

내일배움캠프

목록 보기
13/62
post-thumbnail

📌 TIL (Today I Learned) - 2025년 3월 17일

오늘은 알고리즘 문제 중 "가까운 수 찾기" 문제를 해결하면서 여러 가지 방법을 고민해보았다.


🔹 가까운 수 찾기 문제

문제 설명:
정수 배열 array와 정수 n이 주어질 때, array에 있는 수 중 n과 가장 가까운 수를 반환하는 함수를 구현하라.
가장 가까운 숫자가 여러 개라면, 더 작은 숫자를 반환해야 한다.


🔹 접근 방법

처음에는 array의 각 요소에서 n을 뺀 값을 저장한 후, 절댓값을 비교하는 방식으로 접근했다.
하지만 가공된 값만 보고 원래 숫자가 무엇인지 알 수 없는 문제가 발생했다.

해결 방법으로 딕셔너리를 사용하여 원래 숫자를 저장하는 방법을 생각했지만,
더 나은 방법을 고민하다가 정렬을 사용하거나, 직접 반복문을 돌며 최소값을 찾는 방식을 선택했다.


🔹 시도 과정

첫번째 시도

  • 처음에는 array의 각 요소에서 n를 뺀 값을 다른 배열에 저장 후, 0보다 작은 요소에 -1를 곱해 절대값으로 만들었다.
  • 그리고 절대값만 저장된 배열에서 0과 가장 가까운 수를 찾으려고 했다.
  • 하지만 이렇게 해보니 반환을 해야될 값을 어떻게 정해야되는 알수없었다.

두번째 시도

  • 딕셔너리를 이용하여 원래 원소를 키값으로 저장
  • array의 각 요소에서 n를 뺀 값을 절대값으로 저장한 값을을 딕셔너리의 으로 넣었다.
  • 그리고 딕셔너리에서 값 중에 가장 작은 값을 가진 키를 반환하려고 했으나, 키를 반환하는 법을 모르겠어서 포기...

세번째 시도

  • 반복문을 사용해 절대값을 비교하여 가장 작은 수를 찾는법을 생각했다.
  • 현재 원소를 저장하는 변수제일 작은수를 저장하는 변수를 사용했다.
  • 제일 어려웠던 점은 원래 원소를 리턴해야는데 연산도 해야되니,
    같이 나눠서 진행하는 방법을 찾는것이 쉽지 않았다..

🔹 해결 방법

1. 첫번째 시도

반복문을 이용해 최소값을 직접 찾는 방식 사용

func closestNumber(array: [Int], n: Int) -> Int {
    var closest = array[0]
    var minDiff = (array[0] - n < 0) ? -(array[0] - n) : (array[0] - n) // 절댓값 구하기
    
    for num in array {
        let diff = (num - n < 0) ? -(num - n) : (num - n) // 절댓값 구하기
        
        if diff < minDiff || (diff == minDiff && num < closest) {
            closest = num
            minDiff = diff
        }
    }
    
    return closest
}

// 예제 실행
let array = [3, 10, 28, 20, 15]
let n = 18
print(closestNumber(array: array, n: n)) // 출력: 20
  • minDiff 변수로 n과 가장 가까운 차이를 추적
  • for문을 사용해 array의 모든 요소를 확인
  • 차이가 더 작은 값이 나오면 closest를 업데이트
  • 차이가 같으면 더 작은 값 선택

2. sorted 와 abs 를 활용한 방법

직접 만든 코드보다 더 간결하고 효율적인 방법을 찾아보았다.
Swift에서는 sorted(by:)를 사용하면 직접 정렬 기준 만들고 정렬을 할 수 있는것을 알게됐다.
또, abs() 를 사용하면 절대값을 반환 받을 수 있다.
아직은 익숙하지 않아서 블로그를 보면서 작성해보았다.

func closestNumber(array: [Int], n: Int) -> Int {
    return array.sorted {
        let diff1 = abs($0 - n)
        let diff2 = abs($1 - n)
        return diff1 == diff2 ? $0 < $1 : diff1 < diff2
    }.first!
}

// 예제 실행
let array = [3, 10, 28, 20, 15]
let n = 18
print(closestNumber(array: array, n: n)) // 출력: 20
  • abs()를 사용하여 절대값으로 변환
  • sorted(by:)를 사용하여 절댓값 기준 정렬 후 첫 번째 값 반환
  • 차이가 같다면 더 작은 값이 앞으로 오도록 정렬

🔹 배운점과 느낀점

1️⃣ sorted(by:)를 활용하면 정렬 기준을 직접 정의할 수 있다.
2️⃣ abs() 함수는 음수를 양수로 바꿔주는 간단한 방법이다.
3️⃣ 내가 아직 모르는 Swift 내장함수가 많다...
4️⃣ 내장함수를 찾아도 아직은 자유롭게 활용을 못하겠다..

profile
iOS 개발 블로그

0개의 댓글