※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 13701번 문제인 중복 제거이다.
문제는 아래 링크를 확인하자.
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
메모리제한이 없었다면 단순하게 방문여부만을 확인하는 크기 33554432의 bool 배열을 만들어 간단히 해결할 수 있었을 것이다.
위 배열의 각 원소는 방문했는지 안했는지의 여부만을 저장하면 되므로 1비트로도 충분히 정보를 담을 수 있다는 점을 관찰하자. 이를 이용해 33554432개의 비트를 이용해 메모리를 압축하고 문제를 해결하자.
별해로, vector<bool>의 경우 gcc가 각 자료를 1비트로 저장하게끔 메모리최적화를 해주므로 단순히 vector<bool>을 이용하는 것으로도 문제를 해결할 수 있다.
아래는 제출한 소스코드이다.
#include <iostream>
using namespace std;
int arr[1048576];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int x;
while (cin >> x) {
int cell = x / 32, i = x % 32;
if (arr[cell] & (1 << i)) continue;
arr[cell] |= (1 << i);
cout << x << ' ';
}
}
아래는 vector<bool>을 이용한 별해이다.
#include <iostream>
#include <vector>
using namespace std;
vector<bool> arr(33554432);
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int x;
while (cin >> x) {
if (!arr[x]) {
cout << x << ' ';
arr[x] = 1;
}
}
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 26941 // C++] Pyramidbygge (0) | 2022.12.28 |
---|---|
[BOJ 13702 // C++] 이상한 술집 (0) | 2022.12.28 |
[BOJ 24196 // C++] Gömda ord (0) | 2022.12.27 |
[BOJ 26770 // C++] Basen (0) | 2022.12.26 |
[BOJ 26849 // C++] Non Classical Problem (0) | 2022.12.26 |