Post

[Programmers] #120890 - 가까운 수 [Java][C++][Python]

정수 배열에서 정수 n과의 차이가 가장 작은 원소를 찾고, 차이가 같으면 더 작은 값을 반환하는 워밍업 문제.

[Programmers] #120890 - 가까운 수 [Java][C++][Python]

문제 링크


1. 아이디어

배열을 한 번 순회하며 n과의 절댓값 차이가 가장 작은 원소를 추적한다. 차이가 같은 원소가 나오면 더 작은 값으로 갱신한다.


2. 복잡도

접근시간공간
풀이$O(N)$$O(1)$

($N$ = array의 길이)


3. 코드

풀이 [Java][C++][Python]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Solution {
    public int solution(int[] array, int n) {
        int ans = 0;
        int diff = 100;

        for (int x : array) {
            if (Math.abs(x - n) < diff) {
                ans = x;
                diff = Math.abs(x - n);
            } else if (Math.abs(x - n) == diff && x < ans) {
                ans = x;
            }
        }

        return ans;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <bits/stdc++.h>
using namespace std;

int solution(vector<int> array, int n) {
    int ans = 0;
    int diff = 100;

    for (int x : array) {
        if (abs(x - n) < diff) {
            ans = x;
            diff = abs(x - n);
        } else if (abs(x - n) == diff && x < ans) {
            ans = x;
        }
    }

    return ans;
}
1
2
def solution(array, n):
    return min(array, key=lambda x: (abs(x - n), x))

minkey(abs(x - n), x) 튜플을 넘긴다. 튜플은 앞 원소부터 차례로 비교되므로 먼저 n과의 절댓값 차이가 가장 작은 원소가 뽑히고, 그 차이가 같은 원소가 여럿이면 두 번째 원소인 원소값이 더 작은 쪽이 선택된다. 별도의 동점 처리 분기 없이 정렬 키 하나로 두 조건이 동시에 해결된다.


This post is licensed under CC BY 4.0 by the author.