알고리즘/프로그래머스 1단계

프로그래머스 - 특이한 정렬 - C++

게임만드는학생 2023. 9. 9. 12:24

https://school.programmers.co.kr/learn/courses/30/lessons/120880

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

#include <string>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;

int Num;

bool compare(const int& a,const int& b)
{
    if(abs(Num-a)<abs(Num-b))
        return true;
    else if(abs(Num-a)==abs(Num-b))
    {
        if(a<b)
            return false;
        else return true;
    }
    else return false;
            
            
}

vector<int> solution(vector<int> numlist, int n) {
    vector<int> answer;
    Num=n;
    sort(numlist.begin(),numlist.end(),compare);
    
    return numlist;
}

 

설명

정렬문제이다.

조건은 주어진 n과의 거리가 가까운 순서로 그리고 거리가 동일하면 더 큰 숫자가 앞으로 오게 정렬하면 된다. 

 

해결하는 아주 간단한 방법이 있다.

 

바로 sort 함수를 사용하는것이다.

<algorithm> 헤더파일에 있는 sort 함수는 vector의 iterator의 시작과 끝지점을 알려주면 급그 범위안에서 정렬을 해준다.

그리고 사용자가 정렬기준을 sort 함수에 전달할 수 있다.

 

그것이 compare 함수이다.

 

bool 리턴타입으로 false 리턴시 두 인자의 위치를 교환한다. 

 

여기서

if(abs(Num-a)<abs(Num-b))
        return true;

만약 a가 더 가까우면 true를 리턴해 위치를 유지한다. 

 

else if(abs(Num-a)==abs(Num-b))
    {
        if(a<b)
            return false;
        else return true;
    }

그리고 거리가 똑같을 때, b가 더 큰 수면 false를 리턴해 위치를 바꾼다.

 

참고로 sort 함수에 전달되는 compare의 a,b 매개변수는 numlist의 0번 1번 인덱스 처럼 주어진다. 

즉 a가 더 작은 인덱스 번호이다.

 

 else return false;

마지막으로 b가 더 가까우면 false를 리턴해 위치를 바꾼다.