<백준> 18870

진기명기·2025년 4월 15일

코딩테스트<C++>

목록 보기
43/212

좌표 압축

문제
수직선 위에 N개의 좌표 X1, X2, ..., XN이 있다. 이 좌표에 좌표 압축을 적용하려고 한다.
Xi를 좌표 압축한 결과 X'i의 값은 Xi > Xj를 만족하는 서로 다른 좌표 Xj의 개수와 같아야 한다.
X1, X2, ..., XN에 좌표 압축을 적용한 결과 X'1, X'2, ..., X'N를 출력해보자.

입력
첫째 줄에 N이 주어진다.
둘째 줄에는 공백 한 칸으로 구분된 X1, X2, ..., XN이 주어진다.

출력
첫째 줄에 X'1, X'2, ..., X'N을 공백 한 칸으로 구분해서 출력한다.

입력값을 저장하고 정렬해서 인덱스를 매기고 각 숫자가 원래 어디있었는지 기억하기 위해 pair 클래스를 사용해서 값을 출력했다.

int main()
{
	int n;
	cin >> n;

	vector<long> originV(n);
	vector<pair<long long, long long>> v;

	for (int i = 0;i < n;i++)
	{
		int value;
		cin >> value;
		v.push_back({ value, i });
	}
	sort(v.begin(), v.end());

	int rank = 0;
	originV[v[0].second] = rank;

	for (int i = 1;i < n;i++)
	{
		if (v[i].first != v[i - 1].first)
			rank++;
		originV[v[i].second] = rank;
	}

	for (int i = 0;i < n;i++)
		cout << originV[i] << " ";
}

0개의 댓글