반응형
문제는 다음과 같습니다.
https://www.acmicpc.net/problem/18870
18870번: 좌표 압축
수직선 위에 N개의 좌표 X1, X2, ..., XN이 있다. 이 좌표에 좌표 압축을 적용하려고 한다. Xi를 좌표 압축한 결과 X'i의 값은 Xi > Xj를 만족하는 서로 다른 좌표의 개수와 같아야 한다. X1, X2, ..., XN에 좌
www.acmicpc.net
풀이 과정은 다음과 같습니다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
vector<int> v1, v2;
int N;
int input;
cin >> N;
for(int i{0}; i < N; i++) {
cin >> input;
v1.push_back(input);
v2.push_back(input);
}
sort(v1.begin(), v1.end());
v1.erase(unique(v1.begin(), v1.end()), v1.end());
for(int i{0}; i < N; i++) {
cout<<lower_bound(v1.begin(),v1.end(),v2[i])-v1.begin()<<" ";
}
}
문제 해석이 오래 걸렸던 문제입니다.
좌표를 압축한다는 말을 잘 접하지 못할뿐더러, 백준에 제시된 설명이 조금은 불친절하다(설명이 부족하다)고 느껴지기 때문입니다.
아무튼 좌표를 압축한다는 뜻은 " 입력받은 수 중에서 몇 번째로 작은 수인가? "를 뜻한다고 보면 될 것 같습니다.
원래의 뜻은 그 수보다 입력받은 수열 중에서 작은 수가 몇 개나 있는 지를 확인하는 거지만 비슷하다고 생각합니다.
vector를 2개 만들어서 하나는 정렬하여 순서로 사용하였습니다.
이 과정에서 접하게 되는 명령어 중, lower_bound는 이중탐색을 통해 입력받은 값 이상의 값을 가지는 iterator를 반환해 줍니다.
이를 이용해서 좌표를 압축하여 출력할 수 있습니다.
반응형
'백준 문제풀이' 카테고리의 다른 글
10866 번 : 덱 (0) | 2023.06.07 |
---|---|
9012 번 : 괄호 (0) | 2023.06.07 |
1004 번 : 어린왕자 [AI 풀이 , 후기] (0) | 2023.05.23 |
10815 번 : 숫자 카드 (0) | 2023.05.11 |
1181 번 : 단어 정렬 (0) | 2023.05.06 |