오늘은 알고리즘 문제 중 "가까운 수 찾기" 문제를 해결하면서 여러 가지 방법을 고민해보았다.
문제 설명:
정수 배열array와 정수n이 주어질 때,array에 있는 수 중n과 가장 가까운 수를 반환하는 함수를 구현하라.
가장 가까운 숫자가 여러 개라면, 더 작은 숫자를 반환해야 한다.
처음에는 array의 각 요소에서 n을 뺀 값을 저장한 후, 절댓값을 비교하는 방식으로 접근했다.
하지만 가공된 값만 보고 원래 숫자가 무엇인지 알 수 없는 문제가 발생했다.
해결 방법으로 딕셔너리를 사용하여 원래 숫자를 저장하는 방법을 생각했지만,
더 나은 방법을 고민하다가 정렬을 사용하거나, 직접 반복문을 돌며 최소값을 찾는 방식을 선택했다.
array의 각 요소에서 n를 뺀 값을 다른 배열에 저장 후, 0보다 작은 요소에 -1를 곱해 절대값으로 만들었다.array의 각 요소에서 n를 뺀 값을 절대값으로 저장한 값을을 딕셔너리의 값으로 넣었다.반복문을 이용해 최소값을 직접 찾는 방식 사용
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를 업데이트 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️⃣ 내장함수를 찾아도 아직은 자유롭게 활용을 못하겠다..