[코딩 테스트 연습 입문] 가까운 수
문제
정수 배열 array와 정수 n이 매개변수로 주어질 때, array에 들어있는 정수 중 n과 가장 가까운 수를 return 하도록 solution 함수를 완성해주세요.
❗제한사항❗
- 1 ≤ array의 길이 ≤ 100
- 1 ≤ array의 원소 ≤ 100
- 1 ≤ n ≤ 100
- 가장 가까운 수가 여러 개일 경우 더 작은 수를 return 합니다.
입출력 예
입출력 예 설명
입출력 예 #1
- 3, 10, 28 중 20과 가장 가까운 수는 28입니다.
입출력 예 #2
- 10, 11, 12 중 13과 가장 가까운 수는 12입니다.
✔풀이
def solution(array, n):
answer = 0
ab=n # 절댓값을 비교하기 위해 마련된 변수
for i in array:
if abs(i-n)<ab:
answer=i
ab=abs(i-n)
elif abs(i-n)==ab: # 차의 절댓값이 그 전과 같다면 더 작은 수가 return 되어야 함
if i>answer:
pass
else:
answer=i
return answer
📝설명
array 속 배열을 하나씩 꺼내서 n과 비교하고, 절댓값을 구해 결과적으로 절댓값이 제일 작은 수를 return시켜야 한다.
절댓값을 계속해서 비교해야 하기 때문에 abs를 뜻하는 변수 ab를 만들었고, 초깃값은 n으로 정의했다.
for문을 통해 array를 돌리는데, i-n에 절댓값을 구하는 abs()를 씌운 후, ab와 비교한다.
이 때 abs(i-n)이 기존에 정의되어있는 an보다 작다면 return될 answer을 i로 정의하고, 절댓값은 array 안의 요소들을 다 비교해야 하기 때문에, 다시 재정의한다.
만약, abs(i-n)이 기존의 ab와 같다면 어떻게 해야 할까?
제한사항을 보면, 더 작은 수를 return한다고 한다. 따라서, i가 answer보다 크다면 pass하고, i가 answer보다 크지 않다면 i를 answer의 값으로 넣으면 된다.
👑모범 답안
🔎 내 두자릿수 코드가 이렇게 간결하게 요약되다니..^^
lambda함수에서 key를 사용해서 리스트를 정렬할 수 있다!key 인자에 함수를 넘겨주면 우선순위가 정해지는데, 여기에서의 우선순위는 abs(x-n),x-n 순이다.array안의 숫자 x와 n의 차를 절댓값으로 구하고, 이 값이 만약 똑같다면, 두번째에 있는 x-n으로 판단한다.x-n이 작을수록 더 작은 x임을 알 수 있고, 이는 제한조건을 충족한다.
이렇게 계산한 array를 sort를 사용하여 점점 커지도록! 정렬을 시켜준다.
그렇게 정렬된 array의 인덱스 [0]에는 앞선 코드에서 짠 우선순위에 맞는 순으로 정렬된 것이 있을 것이다.
이를 return하면 된다.
👀느낀 점
: lambda를 수업에서 배웠는데도, 다양한 용도로 사용될 수 있다는 게 신기하다.
리스트를 lambda와 key를 사용해서 우선순위를 정해서 정렬하는 걸 알게 되었다.
나중에 필요할 때 써먹어야지 ㅎㅎ