BOJ 18870 좌표 압축

2020. 9. 21. 16:49·알고리즘/BOJ

www.acmicpc.net/problem/18870

 

18870번: 좌표 압축

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

www.acmicpc.net

좌표 압축 문제는 테크닉은 어렵지 않지만 더 어려운 문제에서 활용되어 쓰인다고 한다.

처음에는 pair를 사용해서 인덱스와 값을 입력받고 정렬 후 O(N)으로 처리하려 했는데 잘 안돼서 찾아보니

unique와 lower_bound를 사용해서 해결하는 문제였다.

 

우선 배열 2개를 선언해서 같은 값을 받아준다.

	vector<int> ar(n), ans(n);
	for (int i = 0; i < n; i++) {
		cin >> ar[i]; ans[i] = ar[i];
	}

이 후에 정렬을 하고 중복을 제거해주면 이런 상태가 된다.

 

 

  2   4   -10   4   -9

-10  -9    2    4    

 

이 상태에서 lower_bound를 통해 인덱스를 구해주면 된다.

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
	ios::sync_with_stdio(false); cin.tie(0);

	int n;
	cin >> n;
	vector<int> ar(n), ans(n);
	for (int i = 0; i < n; i++) {
		cin >> ar[i]; ans[i] = ar[i];
	}
	sort(ans.begin(), ans.end());
	auto it = unique(ans.begin(), ans.end());

	for (int i = 0; i < n; i++)
		cout << lower_bound(ans.begin(), it, ar[i]) - ans.begin() << ' ';

	return 0;
}

해답을 안 봤으면 못 떠올렸을 것 같은 문제였다..

'알고리즘 > BOJ' 카테고리의 다른 글

BOJ 2015 수들의 합 4  (0) 2020.09.23
BOJ 팰린드롬?  (0) 2020.09.22
BOJ 1747 소수&팰린드롬  (0) 2020.09.21
백준 2086 피보나치 수의 합  (0) 2020.09.20
BOJ 11778 피보나치 수와 최대공약수  (0) 2020.09.19
'알고리즘/BOJ' 카테고리의 다른 글
  • BOJ 2015 수들의 합 4
  • BOJ 팰린드롬?
  • BOJ 1747 소수&팰린드롬
  • 백준 2086 피보나치 수의 합
khyu2
khyu2
  • khyu2
    dev log
    khyu2
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 알고리즘
        • BOJ
        • Programmers
        • Algorithm
        • SWEA
      • 개발
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    큐
    SWEA
    다익스트라
    피보나치 수
    BFS
    팰린드롬
    행렬 제곱
    구현
    트리
    조합
    완전탐색
    피사노 주기
    GREEDY
    dp
    분할 정복
    알고리즘
    dfs
    이분 탐색
    소수
    코딩테스트 연습
    시뮬레이션
    냅색
    크루스칼
    MST
    BOJ
    우선순위 큐
    프로그래머스
    유니온 파인드
    완전 탐색
    이분탐색
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
khyu2
BOJ 18870 좌표 압축
상단으로

티스토리툴바