알고리즘/프로그래머스 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를 리턴해 위치를 바꾼다.