덩치(백준)

108번뇌·2021년 5월 2일
0


이 문제를 맞닥뜨리고 잘못 접근했다.

#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;
    }
}```
profile
내일 아침 눈을 떳을 때, '기대되는 오늘 하루를 만들기 위해' 나는 오늘도 생각하고 고민한다.

0개의 댓글

관련 채용 정보