문제) 백준 - 정렬(Sorting) - 좌표 압축
-> https://www.acmicpc.net/problem/18870
18870번: 좌표 압축
수직선 위에 N개의 좌표 X1, X2, ..., XN이 있다. 이 좌표에 좌표 압축을 적용하려고 한다. Xi를 좌표 압축한 결과 X'i의 값은 Xi > Xj를 만족하는 서로 다른 좌표의 개수와 같아야 한다. X1, X2, ..., XN에 좌
www.acmicpc.net
n이 최대 100만이기 때문에 O(nlogn)으로 짜야한다.
좌표의 값과 인덱스를 저장 후 값에 대하여 오름차순으로 정렬한다. 그 후 ans에 압축 적용된 값을 넣는다.
C++ 소스 코드)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <bits/stdc++.h> | |
#define endl "\n" | |
#define ll long long | |
#define INF 987654321 | |
#define MAX 51 | |
#define MOD 1000000000 | |
using namespace std; | |
typedef pair<int, int> p; | |
bool cmp(p a, p b) { | |
return a.second < b.second; | |
} | |
int n; | |
p num[1000001]; | |
int ans[1000001]; | |
int main() { | |
ios_base::sync_with_stdio(0); | |
cin.tie(0); cout.tie(0); | |
cin >> n; | |
for (int i = 0; i < n; ++i) { | |
cin >> num[i].first; | |
num[i].second = i; | |
} | |
sort(num, num + n); | |
ans[num[0].second] = 0; | |
for (int i = 1; i < n; ++i) { | |
if (num[i - 1].first == num[i].first) | |
ans[num[i].second] = ans[num[i - 1].second]; | |
else | |
ans[num[i].second] = ans[num[i - 1].second] + 1; | |
} | |
for (int i = 0; i < n; ++i) | |
cout << ans[i] << " "; | |
return 0; | |
} |
반응형
'PS(Problem Solving) > 백준_BOJ' 카테고리의 다른 글
[백준] 1563번 - 개근상 (C++) 문제 및 풀이 (0) | 2021.07.06 |
---|---|
[백준] 1351번 - 무한 수열 (C++) 문제 및 풀이 (0) | 2021.07.06 |
[백준] 10422번 - 괄호 (C++) 문제 및 풀이 (0) | 2021.06.29 |
[백준] 14499번 - 주사위 굴리기 (C++) 문제 및 풀이 (0) | 2021.06.29 |
[백준] 1715번 - 카드 정렬하기 (C++/파이썬) 문제 및 풀이 (0) | 2021.04.14 |
댓글