Buᐢ༝ᐢy 2023. 1. 28. 06:00

코딩테스트 연습 - 가까운 수

문제 설명


정수 배열 array와 정수 n이 매개변수로 주어질 때, array에 들어있는 정수 중 n과 가장 가까운 수를 return 하도록 solution 함수를 완성해주세요.

제한사항


  • 1 ≤ array의 길이 ≤ 100
  • 1 ≤ array의 원소 ≤ 100
  • 1 ≤ n ≤ 100
  • 가장 가까운 수가 여러 개일 경우 더 작은 수를 return 합니다.

입출력 예


array n result

[3, 10, 28] 20 28
[10, 11, 12] 13 12

입출력 예 설명


입출력 예 #1

  • 3, 10, 28 중 20과 가장 가까운 수는 28입니다.

입출력 예 #2

  • 10, 11, 12 중 13과 가장 가까운 수는 12입니다.

제출 코드


2022년 12월 26일

#include <string>
#include <cmath>
#include <vector>
#include <algorithm>

using namespace std;

bool compare(pair<int, int> a, pair<int, int> b)
{
    return a.second < b.second;
}

int solution(vector<int> array, int n) {
    int answer = 0;
    int length = array.size();
    vector<pair<int, int>> store;

    for (int i = 0; i < length; i++)
    {
        int temp = pow(n - array[i], 2);
        store.push_back(make_pair(array[i], temp));
    }

    sort(store.begin(), store.end(), compare);

    if(store[0].second == store[1].second)
    {
        return answer = store[0].first > store[1].first ? store[1].first : store[0].first;
    }

    else return answer = store[0].first;
}
  • 처음에 풀었던 코드

<aside> 1️⃣ 원래 값과 뺀 값을 제곱한 값을 pair로 저장한다.

</aside>

<aside> 2️⃣ 두번째를 기준으로 오름차순으로 정렬한다.

</aside>

<aside> 3️⃣ 만일 같은 수가 있을 수 있으니 pair에 저장한 원본값을 비교해서 더 작은 수를 반환시켜준다.

</aside>

<aside> 4️⃣ 같은 수가 없다면 store 벡터의 0번째 인덱스를 반환한다.

</aside>

#include <string>
#include <vector>
#include <algorithm>
#include <cmath>

using namespace std;

int solution(vector<int> array, int n) {
    int answer = 0;
    int temp = 10001;
    
    sort(array.begin(), array.end());
    
    for(auto a : array)
    {
        int compare = abs(a - n);
        
        if(temp > compare)
        {
            temp = compare;
            answer = a;
        }
    }
    
    return answer;
}
  • 이후에 다시 푼 코드

역시 더 간단한 코드가 존재했다…

<aside> 1️⃣ 절대값을 반환하는 abs 함수를 사용해서 가장 작은 값을 찾아 answer에 넣어준다.

</aside>

<aside> 2️⃣ compare 값이 최저라면 answer에 해당 원소 값을 넣어준다.

</aside>

원소가 1, 2, 3인 벡터에서 2와 가까운 수를 찾을 때에도 걱정할 필요가 없다. 뒤에 있는 수의 절대값이 1로, 1와 같다고 하더라도 if(temp > compare)이기 때문에 3이 해당 분기문에 들어올 수 없다. 분기문에 들어오려면 if(temp >= compare)가 되어야 한다.