Key Point
- 메모리 제한 때문에 무조건 비트를 이용하여 풀어야한다.
- 메모리 제한이 없다면 수를 int 배열에 넣는 방법도 있겠지만, 총 메모리는 입력 개수 * 4 byte 이므로 상당히 커진다. 그러므로 이와 비슷한 문제는 bitset을 이용하는게 효율적이다.
- 비트셋, 비트연산에 대해 알아야한다.
참고 +) https://www.crocus.co.kr/550
[13701번] 중복 제거
문제 출처 : https://www.acmicpc.net/problem/13701 알고리즘 분석 : 문제 해결에 필요한 사항1. 비트 연산2. bitset bitset 개념 :: http://www.crocus.co.kr/549 비트 연산으로 풀어도 되고, 비트셋으로 풀어도 된다. 비
www.crocus.co.kr
Idea
나는 비트셋으로 문제를 풀었다.
엔터가 들어오면 입력을 종료하도록 구현하는 부분에서 약간 헤맸다.
getline으로 입력을 받고 string을 int로 변환하는 방법도 써봤지만 결국 검색을 통해 해결하였다^^
이 부분도 역시 비트연산을 이용하면 됐다. scanf는 성공적으로 받은 입력의 개수를 리턴하는데 EOF를 읽거나 에러 발생시 -1을 리턴한다. -1은 이진수로 1111 .... 1111이고 여기에 not(~)을 붙이면 0이 된다.
따라서 EOF가 들어오면 while 안의 값이 0이 되어 while문을 빠져나오는 것이다.
그 동안 scanf의 리턴값에 대해 생각해본적이 없어서 조금 창피했다. 기본중의 기본같은데 난 역시 아직 기초가 부족한 것 같다.
Code
#include <iostream>
#include <bitset>
using namespace std;
bitset<33554432> bs;
int main() {
bs.reset();
int n = 0;
while (~scanf("%d", &n)) {
if (!bs[n]) cout << n << ' ';
bs[n] = 1;
}
return 0;
}
'나도 공부한다 > 알고리즘' 카테고리의 다른 글
[백준] 7568. 덩치 (C++) (0) | 2023.02.07 |
---|---|
일반적인 상황에서 벡터 초기화가 꼭 필요할까? (C++) (0) | 2023.02.06 |
[백준] 1654. 랜선 자르기 (C++) (0) | 2023.01.31 |
[백준] 2805. 나무자르기 (C++) (0) | 2023.01.26 |
[백준] 1436. 영화감독 숌 (C++) (0) | 2023.01.24 |