문제 링크 : https://www.acmicpc.net/problem/18870
18870번: 좌표 압축
수직선 위에 N개의 좌표 X1, X2, ..., XN이 있다. 이 좌표에 좌표 압축을 적용하려고 한다. Xi를 좌표 압축한 결과 X'i의 값은 Xi > Xj를 만족하는 서로 다른 좌표 Xj의 개수와 같아야 한다. X1, X2, ..., XN에
www.acmicpc.net
[문제]
수직선 위에 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을 공백 한 칸으로 구분해서 출력한다.
[제한]
- 1 ≤ N ≤ 1,000,000
- -109 ≤ Xi ≤ 109
[알고리즘 분류]
- 정렬
- 값 / 좌표 압축
[해설]
이 문제는 좌표값들을 중복 없이 배열에 크기 순으로 나열했을 때 각 값들의 인덱스를 출력하는 문제였다.
따라서, 배열에 중복 제거 (unique), 정렬(sort)만 어떻게 수행하는지 안다면 쉽게 해결할 수 있는 문제라고 할 수 있다.
우선, 좌표를 입력받아 저장할 배열 두 가지를 선언한다. 여기에서 배열1은 출력할 압축된 좌표들의 순서를 담은 배열이고, 나머지 하나 배열2는 중복된 좌표들을 제거 및 정렬하여 저장할 배열이다.
반복문을 통해 좌표들을 입력받아 두 배열에 저장한 뒤, 중복 제거와 정렬을 수행할 배열에 정렬을 수행하고 중복된 값들이 제거된 배열의 크기 size를 선언한다.
마지막으로는 lower_bound()를 사용해서 배열1에 저장된 좌표들을 순서대로 가져와 각각의 인덱스를 출력할 것이다.
lower_bound()는 찾으려는 key 값보다 크거나 같은 요소를 배열에서 어떤 위치에 처음 등장하는지 찾는 용도로 쓰인다.
(자세한 사용법을 설명하기에는 너무 길어지므로 패스)
이 lower_bound()에서 lower_bound(배열명,범위,찾고자하는 요소) - 배열명 을 수행하게 되면 찾고자하는 요소의 인덱스를 알 수 있는데, 이를 공백으로 나누어 출력하면 해당 문제에서 요구하는 답을 구할 수 있다.
[정답 코드]
#include<bits/stdc++.h>
using namespace std;
int a[1100100],b[1100100],n;
int main(){
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
b[i]=a[i];
}
sort(b,b+n);
int size=unique(b,b+n)-b;
for(int i=0;i<n;i++) printf("%ld ",lower_bound(b,b+size,a[i])-b);
}
[결과]
'Algorithm' 카테고리의 다른 글
[Algorithm] 백준 1927번 : 최소 힙 (C++) (0) | 2023.08.10 |
---|---|
[Algorithm] 백준 11279번 : 최대 힙 (C++) (0) | 2023.08.09 |
[Algorithm] 백준 11659번 : 구간 합 구하기 4 (C++) (0) | 2023.08.06 |
[Algorithm] 백준 11047번 : 동전 0 (C++) (0) | 2023.08.03 |
[Algorithm] 백준 9375번 : 패션왕 신해빈 (C++) (0) | 2023.08.01 |