본문 바로가기
Algorithm/백준풀이

[알고리즘 문제풀이] 백준 13701 중복제거(JAVA)

by 계범 2022. 1. 13.

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

/**
 * 입력값 500만
 * 입력데이터 2^25
 * 
 * 실패함 ㅠ
 * 
 * 비트마스크 풀이
 * 
 * 1. 비트셋 활용 풀이
 * 
 * 입력값을 받으면서,
 * 현재 데이터가 비트셋에 없었으면 비트셋 표기 및 출력
 * 있었으면 패스
 * 
 * 2. 배열 + 비트 마스크
 * 
 * 배열을 비트셋같이 쓸거임 arr
 * 
 * int 자료형은 2^32가 최대이므로, 비트로 32까지 표기가능
 * 
 * 배열의 크기는 입력데이터가 2^25까지였으므로, 32(2^5)로 나눈 2^20으로 지정
 * 
 * 숫자 a가 들어오면
 * a / 32 = 몫,a % 32 = 나머지 하여 저장
 * arr[몫] = 나머지(int 형태지만 31까지를 체크할 수 있는 배열로 쓸거임)
 * 
 * 입력값이 들어올때마다 해당하는 몫과 나머지가 기존에 있었는지 체크
 * 있었으면 패스 없었다면 저장하고 출력
 */
import java.util.*;
import java.io.*;

public class BJ13701_중복제거 {
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        StringTokenizer st;

        // // 1번 비트셋 풀이
        // BitSet bitSet= new BitSet();
        // st = new StringTokenizer(br.readLine());
        // while(st.hasMoreTokens()){
        //     int a = Integer.parseInt(st.nextToken());
        //     if(!bitSet.get(a)){
        //         bitSet.set(a);
        //         bw.write(a + " ");
        //     }
        // }
        // bw.flush();
        // bw.close();


        // 2번 배열 + 비트마스크 풀이
        int[] number = new int[1<<20];

        st = new StringTokenizer(br.readLine());
        while(st.hasMoreTokens()){
            int a = Integer.parseInt(st.nextToken());
            int x = a / 32;
            int y = a % 32;
            // 해당 몫과 나머지가 기존에 있었는지 체크
            if((number[x] & (1<<y)) != (1<<y)){
                // 해당 몫 위치에 나머지 원소 저장
                number[x] |= (1<<y);
                bw.write(a +" ");
            }
        }
        bw.flush();
        bw.close();
    }
}

댓글