Plite
전자오락 공방
Plite
전체 방문자
오늘
어제
  • 분류 전체보기 (274)
    • 프로젝트 (18)
      • 완성 프로젝트 (3)
      • 프로젝트 진행 내역 (15)
    • 공부 및 정리 (241)
      • 백준 코드 (222)
      • C++ (8)
      • DirectX (2)
      • Unreal Engine (6)
      • 프로그래밍 패턴 (3)
    • 기타 (12)
      • 기타 주저리 (10)
    • 게임과 취미 (1)
    • 대문 (1)

블로그 메뉴

  • 홈
  • 프로젝트
  • 취미, 일상
  • 백준 프로필

공지사항

  • [Read Me]
  • 제 블로그에 방문하신 것을 환영합니다.

인기 글

태그

  • LCA
  • 문자열
  • 구현
  • UC++
  • 세그먼트 트리
  • 스택
  • 조합론
  • 우선순위큐
  • 동적계획법
  • 분할정복
  • 최소 스패닝 트리
  • C++
  • 기하
  • 큐
  • 위상 정렬
  • 트리
  • 정수론
  • 수학
  • KMP
  • 정렬
  • 투포인터
  • 유니온 파인드
  • 그래프
  • 백준
  • 이분탐색
  • 누적합
  • SCC
  • 백트래킹
  • 브루트포스
  • 트라이

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Plite

전자오락 공방

[C++]백준 - 18870번 문제
공부 및 정리/백준 코드

[C++]백준 - 18870번 문제

2021. 6. 3. 16:51

18870번: 좌표 압축 (acmicpc.net)

 

18870번: 좌표 압축

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

www.acmicpc.net

 

18870번 : 좌표 압축


수직선 위에 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을 공백 한 칸으로 구분해서 출력한다.

 

 


 

생각해 볼 점


아무리 용을 써도 시간 초과가 나거나, 어떻게 풀지 감이 잡히지 않아 찾아보니

아예 "좌표 압축 기법"이라는 방법이 존재합니다. 기법으로서 존재할만큼 자주 쓰이니 외워두는 편이 좋겠습니다.

 

참고하기에 좋은 블로그 링크를 남깁니다.

 

 

좌표압축 기법 (tistory.com)

 

좌표압축 기법

좌표압축 기법은 Problem Solving을 하다보면 정말 정말 정말 자주 쓰이는 테크닉이다. 세그트리(or BIT) 등등.. 구간 쿼리와 함께 같이 쓰이는 경우도 많고, 오프라인 쿼리등을 처리할 때 등등 많은

jason9319.tistory.com

 

코드


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

int main()
{
    int N;
    vector<int> v;
    cin >> N;
    int *input = new int[N];
    for(int i = 0; i < N; i++)
    {
        cin >> input[i];
        v.push_back(input[i]);
    }
    sort(v.begin(), v.end());
    v.erase(unique(v.begin(), v.end()), v.end());
     
    for(int i = 0; i < N; i++)
    {
        int res = lower_bound(v.begin(), v.end(), input[i]) - v.begin();
        cout << res << " ";
    }
    delete[] input;
    return 0;
}

 

그 외


lower_bound의 경우, 알고리즘 STL을 사용했으나, 직접 구현하실 경우에는 이진 탐색으로 구현하는 것이 좋습니다.

어차피 정렬된 벡터에서 찾는 것이므로, 이진 탐색을 이용하지 않고 for문을 돌렸다가는 시간 초과가 나기 일쑤입니다.

 

P.S : Set의 iterator는 lower_bound 시, 원하는 값을 얻을 수 없습니다. 트리 형태로 구현되어 있으므로, 순차 배열 방식이 아니기 때문에 그런 것 같습니다.

'공부 및 정리 > 백준 코드' 카테고리의 다른 글

[C++]백준 - 11051번 문제  (0) 2021.06.04
[C++]백준 - 11050번 문제  (0) 2021.06.04
[C++]백준 - 3036번 문제  (0) 2021.06.02
[C++]백준 - 2981번 문제  (0) 2021.06.02
[C++]백준 - 18258번 문제  (0) 2021.05.31
    '공부 및 정리/백준 코드' 카테고리의 다른 글
    • [C++]백준 - 11051번 문제
    • [C++]백준 - 11050번 문제
    • [C++]백준 - 3036번 문제
    • [C++]백준 - 2981번 문제
    Plite
    Plite
    개발 일지, 게임 이야기 등을 적어두는 공간입니다.

    티스토리툴바