티스토리 뷰

문제

 

18870번: 좌표 압축

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

www.acmicpc.net

해결 과정

처음에는 원래의 배열과 솔트한 배열을 작은 숫자부터 비교해 가며 정답 배열에 순서값을 넣은 후 정답 배열을 출력하는 방법을 이용했다. 

#include <stdio.h>
#include <algorithm>

int main() {
    
    int n;
    scanf("%d", &n);
    
    int num[n], sorted[n], ans[n], cur = 0;
    
    for (int i = 0; i < n; i ++) {
        scanf("%d", num+i);
        sorted[i] = num[i];
    }
    
    std::sort(sorted, sorted + n);
    
    for (int i = 0; i < n; i ++) {
        if (i != 0 && sorted[i] == sorted[i-1])
            continue;
        for (int j = 0; j < n; j ++)
            if (sorted[i] == num[j])
                ans[j] = cur;
        cur ++;
    }
    
    for (int i = 0; i < n; i ++)
        printf("%d ", ans[i]);
    printf("\n");
    
}

 

위 코드는 정상적으로 작동은 하지만 n <= 1000000이면서 O(n^2)이기 때문에 시간 초과가 발생했다. 시간복잡도를 줄일 수 있는 방법을 고민해봤지만 방법이 떠오르지 않았다. 힌트를 얻고자 검색했을 때 아래 글을 발견했다.

 

 

[백준 알고리즘 18870] 좌표 압축

​​오늘 올라온 신상문제입니다.간단하게 좌표 받은 후 unique와 erase를 써서 중복제거하고 Lower bound...

blog.naver.com

위의 글에서 내가 써본 적 없는 함수인 unique와 딱 한 번 써본 lower_bound를 이용했다는 것까지 보고 위 문제를 다시 풀게 되었다.

결과

#include <stdio.h>
#include <algorithm>

int main() {
    
    int n;
    scanf("%d", &n);
    
    int num[n], sorted[n];
    
    for (int i = 0; i < n; i ++) {
        scanf("%d", num+i);
        sorted[i] = num[i];
    }
    
    std::sort(sorted, sorted + n);
    int *last = std::unique(sorted, sorted+n);
    
    
    for (int i = 0; i < n; i ++)
        printf("%d ", std::lower_bound(sorted, last, num[i]) - sorted);
    printf("\n");
    
}

메모리는 저렇게 보여도 다른 사람들에 비해 높은 편이 아니었다. 시간이 약간 아쉽다.

회고

우선 STL의 함수들을 한 번 돌아볼 필요가 있다고 느꼈다. STL 함수를 알면 알 수록 능력의 폭이 훨씬 넓어지는 느낌이 든다.

이와는 별개로 주소값을 이용해 답을 낸 것 역시 생각의 폭을 넓혀주었다. 주소값 자체는 쓰레기 값일지 몰라도 주소값의 차는 유용한 값이 될 수 있다는 것을 깨달았다. 

 

'공부한 것들 > 알고리즘' 카테고리의 다른 글

[백준] 9251 - LCS  (0) 2020.02.07
[백준] 1463 - 1로 만들기  (0) 2020.02.05
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함