본문 바로가기

알고리즘 문제 풀이/Baekjoon

10867 - 중복 빼고 정렬하기

반응형
SMALL

 

 

10867번: 중복 빼고 정렬하기

첫째 줄에 수의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째에는 숫자가 주어진다. 이 수는 절댓값이 1,000보다 작거나 같은 정수이다.

www.acmicpc.net

 

힙 정렬 짜고

 

중복 체크하면 끝

 

#include <stdio.h>

const int LM = 1e5;
int N;
int R[LM];
int r;

void swap(int& x, int & y) { int z = x; x = y; y = z; }

int maxComp(int x, int y) { return x > y; }
int minComp(int x, int y) { return x < y; }

struct PQ {
  int hn;
  int heap[LM + 10];
  int (*comp)(int, int);

  void init(bool flag) {
    hn = 0;
    comp = flag ? minComp : maxComp;
  }

  void push(int n) {
    heap[++hn] = n;
    
    for (int c = hn; c > 1; c /= 2) {
      if (comp(heap[c], heap[c/2])) {
        swap(heap[c], heap[c / 2]);
      } else {
        break;
      }
    }
  }

  int pop() {
    swap(heap[1], heap[hn--]);

    for (int c = 2; c <= hn; c *= 2) {
      if (c < hn && comp(heap[c + 1], heap[c])) {
        c++;
      }

      if (comp(heap[c], heap[c / 2])) {
        swap(heap[c], heap[c / 2]);
      } else {
        break;
      }
    }

    return heap[hn + 1];
  }
} pq;

void init() {
  scanf("%d", &N);

  for (int n = 0; n < N; ++n) {
    int t;

    scanf("%d", &t);

    pq.push(t);
  }
}

void print() {
  R[r] = pq.pop();

  int p;

  while (pq.hn) {
    p = pq.pop();

    if (R[r] != p) {
      R[++r] = p;
    }
  }

  for (int i = 0; i <= r; ++i) {
    printf("%d ", R[i]);
  }
}

int main(void) {
  // freopen("10867.txt", "r", stdin);

  pq.init(1);

  init();

  print();

  return 0;
}

 

삼성아 고마워 !

반응형
LIST

'알고리즘 문제 풀이 > Baekjoon' 카테고리의 다른 글

15903 - 카드 합체 놀이  (1) 2023.12.20
11931 - 수 정렬하기 4  (0) 2023.12.19
10808 - 알파벳 갯수  (0) 2023.12.18
2641 - 다각형 그리기  (1) 2023.12.18
시간 복잡도 느린 정렬 모음 - python  (0) 2023.06.16