이 문제를 맞닥뜨리고 잘못 접근했다.
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
int N;
typedef struct DATA {
int iweight;
int iheight;
int iorder;
int iResult;
}DATA;
bool cmpWeight(const DATA& a, const DATA& b)
{
return a.iweight > b.iweight; //무게가 높은순으로 나열합니다.
}
bool cmpOrder(const DATA& a, const DATA& b)
{
return a.iorder < b.iorder; //순서가 낮은순으로 나열합니다.
}
int main()
{
int iResultORi= 1;
//int iResultPlus = 1;
vector<DATA> vTemp;
cin >> N;
for (int i = 0; i < N; i++)
{
DATA dTemp;
dTemp.iorder = i;
cin >> dTemp.iweight;
cin >> dTemp.iheight;
vTemp.emplace_back(dTemp);
}
sort(vTemp.begin(), vTemp.end(), cmpWeight);//일단 몸무게 큰 순서로 정렬한다.
for (int i = 0; i < N; i++)//전체 반복문 범위에서
{
if (i == 0)
{
vTemp[i].iResult = iResultORi;//맨처음 1
}
else if ((i!=0) && (vTemp[i-1].iheight > vTemp[i].iheight) && (i!=N-1))//이경우는 정상케이스입니다.
{
vTemp[i].iResult = ++iResultORi;
}
else
{
vTemp[i].iResult = iResultORi;//공동처리를 위해 이렇게 처리한다.
}
if (i == N - 1)//N번째 처리를 위한 코드입니다.
{
if (vTemp[i-1].iheight > vTemp[i].iheight)
{
vTemp[i].iResult = (int)vTemp.size();//앞에께 몸무게도 많이나가고 키도 큰 경우
}
else
{
vTemp[i].iResult = iResultORi; //공동처리를 위해 이렇게 처리한다
}
}
}
sort(vTemp.begin(), vTemp.end(), cmpOrder);
for (auto elem : vTemp)
{
cout << elem.iResult << " ";
}
return 0;
}
먼저 내 소스.
테스트 케이스에선 이상없이 나오는데 문제가 뭐냐면
12225가 아닌 다른 케이스내에서
122233339이런식으로 나온다는 부분이다.
이거때문에 왜틀린지 몰라서 계속 해맸다.
이문제를 왜 브루트 포스로 접근해줘야하냐면,
각각 element들을 내가 접근한 방식이 아니라,
각각에서 순위를 매겨줘야하기 때문이다.
테스트케이스에서 5개의 원소가 있는데
이 원소들 각각 5번(첫번째 포문)
그다음 각각 원소가 나머지들과 비교했을때 상태에따라(두번째포문)
몸무게도 작고 키도 작아야지 ++를 해줘야한다.
미묘하지만 다른부분 잘 파악해야한다.
[답지소스임]
#include <iostream>
#include <utility>
using namespace std;
int main() {
int num;
int rank = 1;
pair<int,int> arr[50];
cin >> num;
for(int i = 0; i < num; i++)
cin >> arr[i].first >> arr[i].second;
for(int i = 0; i < num; i++)
{
for(int j = 0; j < num; j++)
if(arr[i].first < arr[j].first && arr[i].second < arr[j].second)
rank++;
cout << rank << ' ';
rank = 1;
}
}```