문제링크 : 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
접근 과정 :
- 얼마전에 알게된 BitSet을 이용해서 이전에 입력된 숫자를 저장했다.
- 숫자값에 따른 존재여부를 확인하는 것은 HashSet보다 BitSet이 빠를것이라고 생각했다.
+ 배열과 비트마스킹을 이용한 풀이도 있기에 시도해보았다. (다른사람의 풀이를 참고.)
소스 코드 및 결과 :
package BOJ;
/*
중복 제거
BitSet
*/
import java.io.*;
import java.util.*;
public class BOJ13701 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
BitSet set = new BitSet();
StringBuilder sb = new StringBuilder();
while (st.hasMoreTokens()) {
String s = st.nextToken();
int a = Integer.parseInt(s);
if (!set.get(a)) {
set.set(a);
sb.append(s).append(" ");
}
}
bw.write(sb.toString().trim());
bw.flush();
}
}
package BOJ;
/*
중복 제거
배열 + 비트마스킹
number[a/32]에 비트값으로 나머지를 저장.
*/
import java.io.*;
import java.util.*;
public class BOJ13701_copy {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int[] number = new int[1 << 20];
StringBuilder sb = new StringBuilder();
while (st.hasMoreTokens()) {
String s = st.nextToken();
int a = Integer.parseInt(s);
int x = a / 32;
int y = a % 32;
if ((number[x] & (1 << y)) != (1 << y)) {
number[x] |= (1 << y);
sb.append(s).append(" ");
}
}
bw.write(sb.toString().trim());
bw.flush();
}
}
P.S
중복 제거이기에, 당연히 set를 이용하려고 했다.
아마 BitSet을 모르고 HashSet을 사용했으면, 많은 시간이 소모되었을 것이다..
사실 해당 문제는 두번째 방법처럼 접근하는데 정답이지 않을까 싶다.
'Algorithm' 카테고리의 다른 글
[백준 Silver 2] 10971 외판원 순회2 - Java (0) | 2021.12.22 |
---|---|
[백준 Gold 2] 14657 준오는 최종인재야!! - Java (0) | 2021.12.21 |
[백준 Silver 1] 2961 도영이가 만든 맛있는 음식 - Java (0) | 2021.12.21 |
[백준 Gold 2] 1525 퍼즐 - Java (0) | 2021.12.19 |
[백준 Platinum 5] 6549 히스토그램에서 가장 큰 직사각형 - Java (0) | 2021.12.19 |