KimMinJun
Coding Note
KimMinJun
전체 방문자
오늘
어제
  • 분류 전체보기 (487)
    • ALGORITHM (11)
      • 정렬 (6)
      • 최단경로 (1)
      • 자료구조 (1)
      • 슬라이딩 윈도우 (1)
      • etc (2)
    • Git (5)
    • Web (24)
      • Vanilla JS (13)
      • TS (2)
      • React (7)
      • ETC (1)
    • React 공식문서 (번역, 공부) (11)
      • Quick Start (2)
      • Installation (0)
      • Describing the UI (9)
      • Adding Interactivity (0)
      • Managing State (0)
      • Escape Hatches (0)
    • Next.js 공식문서 (번역, 공부) (3)
      • Getting Started (2)
      • Building Your Application (1)
    • PS (432)
      • 백준 (187)
      • Programmers (105)
      • CodeUp (21)
      • STL (3)
      • 제코베 JS 100제 (50)
      • SWEA (0)
      • LeetCode (65)
    • IT (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록
  • 관리

공지사항

인기 글

태그

  • tree
  • recursion
  • 문자열
  • codeup
  • 백준
  • 그래프
  • 수학
  • Level 0
  • 다이나믹 프로그래밍
  • string
  • js
  • Level1
  • Level 2
  • LeetCode
  • C
  • Level 1
  • 정렬
  • programmers
  • 제코베 JS 100제
  • C++

최근 댓글

최근 글

hELLO · Designed By 정상우.
KimMinJun
PS/백준

백준 / 정렬 / 18870번 / 좌표 압축 / C++

PS/백준

백준 / 정렬 / 18870번 / 좌표 압축 / C++

2022. 1. 25. 01:06

문제

수직선 위에 N개의 좌표 X1, X2, ..., XN이 있다. 이 좌표에 좌표 압축을 적용하려고 한다.

Xi를 좌표 압축한 결과 X'i의 값은 Xi > 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

예제 입력 1 

5
2 4 -10 4 -9

예제 출력 1 

2 3 0 3 1

 

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

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	
	int n;
	cin >> n;
	
	vector<int> v1, v2;
	
	for(int i=0; i<n; i++) {
		int num;
		cin >> num;
		
		v1.push_back(num);
	}
	
	v2 = v1;
	sort(v2.begin(), v2.end());
	v2.erase(unique(v2.begin(), v2.end()), v2.end());
	
	for(int i=0; i<n; i++) {
		int idx;
		auto it = lower_bound(v2.begin(), v2.end(), v1[i]);
		idx = it - v2.begin();
		
		cout << idx << " ";
	}
	
	return 0;
}

일단 문제를 처음보면 이해가 잘 안갈수도 있다.

문제 설명을 간단히 해보자면, 입력받은 수들에서 각각의 수보다 작은 수가 몇개인지 순서대로 출력하는 것이다.

 

따라서 수들을 입력받을 벡터와, 입력받은 수들을 정렬하고 중복을 지울 벡터를 2개 선언하였다.

입력받은 수들을 정렬하고 중복을 지우게 되면, 해당하는 수가 몇번째로 작은 수 인지 판단할 수 있기 때문이다.

 

예를들어 위의 예시처럼 2 4 -10 4 -9 를 입력받게 되면 v1에는 그대로 들어가고,

v2에는 -10 -9 2 4 가 들어가게 되는것이다.

따라서 v1에서 4보다 작은 수가 몇개인지 판단하려면 v2에서 볼경우 -10과 -9과 2이기 때문에 3개이다.

그런데 v2에서 4의 인덱스가 3이기 때문에 갯수는 인덱스와 같다는것을 알 수가 있다.

 

따라서 우리는 v2에서 해당하는 인덱스를 출력해주면 된다.

 

여기서 lower_bound가 사용되는데, lower_bound는 범위내에서 찾으려는 수보다 크거나 같은 수가 몇번째로

등장하는지 알 수 있게 해준다.

lower_bound에 대한 자세한 설명은 밑을 참조바랍니다.(추가예정)

 

그런데 lower_bound는 iterator를 반환하기 때문에 인덱스를 바로 알 수는 없고,

우리가 구한 iterator에서 시작 iterator를 빼주면 해당 인덱스를 구할 수 있다.

저작자표시 (새창열림)

'PS > 백준' 카테고리의 다른 글

백준 / 백트래킹 / 15650번 / N과 M (2) / C++  (0) 2022.01.26
백준 / 백트래킹 / 15649번 / N과 M (1) / C++  (0) 2022.01.26
백준 / 정렬 / 10814번 / 나이순 정렬 / C++  (0) 2022.01.24
백준 / 정렬 / 11651번 / 좌표 정렬하기 2 / C++  (0) 2022.01.22
    'PS/백준' 카테고리의 다른 글
    • 백준 / 백트래킹 / 15650번 / N과 M (2) / C++
    • 백준 / 백트래킹 / 15649번 / N과 M (1) / C++
    • 백준 / 정렬 / 10814번 / 나이순 정렬 / C++
    • 백준 / 정렬 / 11651번 / 좌표 정렬하기 2 / C++
    KimMinJun
    KimMinJun

    티스토리툴바

    단축키

    내 블로그

    내 블로그 - 관리자 홈 전환
    Q
    Q
    새 글 쓰기
    W
    W

    블로그 게시글

    글 수정 (권한 있는 경우)
    E
    E
    댓글 영역으로 이동
    C
    C

    모든 영역

    이 페이지의 URL 복사
    S
    S
    맨 위로 이동
    T
    T
    티스토리 홈 이동
    H
    H
    단축키 안내
    Shift + /
    ⇧ + /

    * 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.