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 이므로 2^25만큼의 배열을 사용하면 메모리 초과가 뜹니다.

따라서 이를 수를 구분할 수 있는 몫과 나머지를 이용한 비트마스킹을 이용합니다.

 

인덱스는 몫이 되겠으며, 비트로 사용할 값은 나머지입니다.

x라는 몫에 y라는 나머지가 있는지 비트 연산자로 확인합니다.

y라는 나머지가 있으면 출력, 없으면 return을 시키면 됩니다.

 

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
#include <iostream>
#define MAX 1 + (1 << 20)
using namespace std;
 
int list[MAX];
 
void func(int N) {
    int x = N >> 5;
    int y = N % 32;
    int z = (1 << y);
 
    if (list[x] & z) return;
    list[x] |= z;
    cout << N << ' ';
}
 
int main() {
    cin.tie(NULL); cout.tie(NULL);
    ios::sync_with_stdio(false);
 
    int N;
    while (cin >> N) {
        func(N);
    }
 
    return 0;
}
cs

 

+ Recent posts