티스토리 뷰

알고리즘/BOJ

[백준] 13701 중복 제거

세진짱 2018. 7. 5. 14:01


BIT를 이용해 풀 수 있는 문제다


int 형은 4byte = 32bit 이므로 1bit에 숫자 하나를 표현한다고 치면 

32개의 숫자를 표현 가능하다


32 = 2^5 이고 숫자가 2^25 까지 들어오므로 2^20개의 int형이 있으면

모든 숫자를 표현 가능하다


그럼 이제 int로 32개의 숫자를 표현하는 방법에 대해 알아보자

이건 2차 배열에서 x,y를 숫자 하나로 표현하는 방식과 비슷하다

숫자 n을 표현할 때 n/32는 몇번째 숫자로 표현 하는지 의미하고

n%32 는 그 숫자에서 몇번째 비트로 표현 하는지 의미한다

만약 5라면 0번째 숫자 5번째 비트이므로

a[0]의 5번째 비트다 

있는지 확인하려면 a[0] &( 1<<5)를 해보면 알 수 있다!


소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <bitset>
using namespace std;
int a[(1 << 20)],n;
int main() {
    while (scanf(" %d"&n) != -1) {
        int x = n / 32;
        int y = n % 32;
        if (!(a[x] & (1 << y))) {
            printf("%d ", n);
            a[x] |= (1 << y);
        }
    }
}
cs


이 문제는 bitset으로도 풀이 가능

소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <bitset>
using namespace std;
 
bitset<(1 << 25)> bt;
int s;
 
int main() {
    int num;
    
    while (scanf("%d",&num) != EOF) {
        if (!bt[num]) {
            bt[num] = 1;
            printf("%d ", num);
        }
    }
    return 0;
}
cs


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

[백준] 15686 치킨 배달  (2) 2018.07.05
[백준] 6603 로또  (0) 2018.07.05
[백준] 11723 집합  (2) 2018.07.05
[백준] 9328 열쇠  (0) 2018.07.04
[백준] 5427 불  (0) 2018.07.04
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/01   »
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
글 보관함