[백준] 13701: 중복 제거 - JAVA
https://www.acmicpc.net/problem/13701
풀이
정수를 입력받으면서 부른적이 없는 정수만 출력하는 문제이다.
set자료구조를 생각했지만 메모리 제한때문에 비트마스킹으로 풀어야한다.
N의 범위는 2^25로 주어져있다. int범위는 32bit까지 담을 수 있기 때문에 32개의 숫자를 중복검사할 수 있다.
따라서, 2^25개의 수를 중복검사하려면 2^20크기의 배열을 만들어 배열의 원소 한 개가 32개의 숫자를 중복검사하도록 구현해야 한다.
int[] number = new int[1 << 20];
2^20크기의 배열을 선언하여 입력받은수를 x라고 할 때, x / 32가 배열의 인덱스, x % 32 가 배열의 해당 원소 안에서 저장할 수가 된다.
메모리: 350208KB
시간: 1388ms
언어: Java 11
코드
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int[] number = new int[1 << 20];
StringBuilder sb = new StringBuilder();
while (st.hasMoreTokens()) {
int num = Integer.parseInt(st.nextToken());
int x = num / 32;
int y = num % 32;
if ((number[x] & (1 << y)) == 0) {
number[x] |= (1 << y);
sb.append(num + " ");
}
}
System.out.println(sb);
}
}