최대 1 분 소요

Question

18870Q


Solution

  • 좌표들을 vector에 저장
  • 각 좌표의 순위를 나타낼 vector를 복제
  • 복제한 vector를 오름차순 정렬시키고 unique()와 erase() 이용하여 중복되는 수 제거
  • lower_bound()를 이용해 index(순위)를 반환하여 출력한다

Cord

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

vector<int> vCoord;

int main()
{
	// 좌표 수 입력
	int nums;
	cin >> nums;

	for (int idx = 0; idx < nums; idx++)
	{
		int coord;
		cin >> coord;
		vCoord.push_back(coord);
	}

	vector<int> vRank(vCoord);

	// 오름차순 정렬
	sort(vRank.begin(), vRank.end());

	// 중복값 제거
	vRank.erase(unique(vRank.begin(), vRank.end()), vRank.end());

	// 출력
	for (int idx = 0; idx < nums; idx++)
	{
		int rank = lower_bound(vRank.begin(), vRank.end(), vCoord[idx]) - vRank.begin();
		cout << rank << ' ';
	}

	return 0;
}

Result

18870


What`s new

i번째 원소를 지우고 싶으면 vector의 시작부터 i를 더하면 된다.
또한, 범위를 지정하여 지울 수 있다.

v.erase(v.begin() + i); // 지정 원소 제거
v.erase(v.begin(), v.begin() + i) // 시작부터 i까지의 원소 제거

배열에서 중복되지 않는 원소들을 앞에서부터 채운다.
나머지 원소들은 그 뒤에 쌓이고 반환 값은 그 첫번째 원소의 주소이다.

unique(v.begin(), v.end());

배열에서 범위 내의 원소들 중 i 값 보다 크거나 같은 첫 번째 원소의 주소를 반환한다
vector가 정렬되어 있어야 한다.

lower_bound(v.begin(), v.end(), i); // 주소를 반환
Lower_bound(v.begin(), v.end(), i) - v.begin() // index 반환

태그: ,

카테고리:

업데이트: