출처: https://3months.tistory.com/307 [Deep Play]

백준/Bit Masking

[BOJ] 13701 중복제거 C++

코딩하는 랄뚜기 2021. 8. 14. 17:44

https://www.acmicpc.net/problem/13701

 

13701번: 중복 제거

문제: N개의 정수 A1, A2, ..., AN 을 읽고, 이들 중에서 반복되는 수를 제외하고 남은 N'개의 수 B1, B2, ..., BN’ 을 입력된 순서대로 출력하시오. 이때, 0 ≤ Ai < 225 = 33554432, i=1,2,…,N. 입력의 개수 N은 1

www.acmicpc.net

수들이 주어졌을 때, 중복한 수가 온다면 출력하지 않는 문제이다. 주어진 메모리가 8MB 밖에 되지 않으므로 비트마스킹으로 이용해야 한다. int형은 4byte 이므로 4*8=32bit이다. 따라서 32가지의 숫자를 저장할 수 있다. 최대 2^25의 수가 주어지기 때문에 2^25/32=2^20의 크기의 배열이 있다면 주어지는 모든 수를 저장 할 수 있다.

숫자 n이 주어지면 n/32의 배열 인덱스에 1<<n%32를 저장해 주면 된다.

 

코드

#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);
        }
    }
}

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

[BOJ] 2098 외판원순회 C++  (0) 2021.08.15
[BOJ] 14391 종이조각 C++  (0) 2021.08.14
[BOJ] 1062 가르침 C++  (0) 2021.08.14
[BOJ] 11723 집합 C++  (0) 2021.08.13