어흥

[백준 13701] 중복 제거 (C++, Java) 본문

알고리즘/백준

[백준 13701] 중복 제거 (C++, Java)

라이언납시오 2021. 6. 9. 18:45
728x90
반응형

문제 링크: 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

 

1. 주의할 점

- 입출력 시간단축 필요

- STL인 BitSet을 이용 or Int[] 배열을 이용하여(32bit) 표현

 

2. 구현

- 비트셋을 이용하여 비트셋에 있으면 무시, 없으면 저장+출력을 진행한다

- 비트셋을 이용하지 않을 경우, Int 타입인 Arr[] 배열을 통해 입력받은 숫자를 32로 나눈다(Int: 4byte → 32bit 때문)

- Val을 32로 나눈 몫을 Q로 저장하고 Arr[] 배열의 Index로 설정한다. 그리고 32로 나눈 나머지값을 << Shift한 값을 R에 저장한다

- R에 Val%32가 아닌 1<<(Val%32)를 저장하는 이유: 각 비트마다 숫자 1개를 표현한다고 생각하면 된다.

Ex. 5 -> Arr[0]에서 5번째 비트, 33 -> Arr[1]에서 1번째 비트

- Arr[Q] & R이 0이라면 추가 + 출력을 수행하고, 0이 아니라면 무시한다

 

[Java]

import java.util.*;
import java.lang.*;
import java.io.*;

class Main {
	public static void main (String[] args) throws java.lang.Exception {
	    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
	    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	    String str = br.readLine();
	    int val;
	    StringTokenizer st = new StringTokenizer(str);
	    BitSet bs = new BitSet();
	    
	    while(st.hasMoreTokens()){
	        val = Integer.parseInt(st.nextToken());
	        if(bs.get(val)) continue;
	        bs.set(val);
	        bw.write(val+" ");
	    }
	    bw.flush();
	}
}

 

[C++]

#include <iostream>
using namespace std;
int arr[1<<20];

int main() {
    ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
    int val;
    while(cin>>val){
        int q = val/32;
        int r = 1<<(val%32);
        if(!(arr[q]&r)){
            arr[q]+=r;
            cout<<val<<" ";
        }
    }
    return 0;
}
728x90
반응형

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

[백준 1240] 노드사이의 거리 (Java)  (0) 2021.06.09
[백준 1322] X와 K (Java)  (0) 2021.06.09
[백준 18119] 단어 암기 (Java)  (0) 2021.06.08
[백준 3653] 영화 수집 (C++)  (0) 2021.06.02
[백준 7578] 공장 (C++)  (0) 2021.06.01
Comments