본문 바로가기

baekjoon

13701번 중복 제거

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

비트마스크를 이용한 문제이다.

메모리 초과가 안 나기 위해서 unsigned char를 이용해 메모리를 줄였으며 8개의 비트에 각 정보를 담은(전체 크기 / 8) 만큼의 메로리로 더 줄였다.

#include <bits/stdc++.h>
#define l long long
#define INF 2e9
#define p pair<int,int>
#define vc vector<unsigned char>
#define F first
#define S second
using namespace std;

bool check(int k,vc &v){
    return v[k >> 3] & (1 << (k & 7));
}
void Set(int k,vc &v){
    v[k >> 3] &= ~(1 << (k & 7));
}

int main() {
    ios_base::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);

    vc v((33554432 + 7) / 8 + 1,255);

    int n;
    while(cin >> n){
        if(check(n,v)){
            cout << n << " ";
            Set(n,v);
        }
    }
}

 

'baekjoon' 카테고리의 다른 글

17144번 미세먼지 안녕!  (0) 2022.04.12
16234번 인구 이동  (0) 2022.04.10
16975번 수열과 쿼리 21  (0) 2022.04.06
10999번 구간 합 구하기 2  (0) 2022.04.05
11559번 Puyo Puyo  (0) 2022.04.04