리뷰
https://www.acmicpc.net/problem/13701
메모리 효율을 극한까지 활용하여 주어지는 숫자들의 중복 제거를 하는 문제
전역 변수
- bucket : 주어지는 정수의 중복 체크를 하기 위한 배열, char을 사용해 각 요소를 1바이트로 만들어 준다.
함수
없음
문제풀이
- 변수 n에 입력이 끝날때 까지 배열의 요소를 입력 받아 준다.
- 변수 idx를 n을 8로 나눈 몫으로, bits를 1을 n을 8로 나눈 나머지 만큼 왼쪽으로 쉬프트한 값을 저장한다.
- bucket[idx]와 bits의 비트 and연산이 true일 경우 이미 나왔던 수 이므로 continue처리해 준다.
- 위 조건에 걸리지 않는다면 bucket[idx]에 bits를 더해 방문체크 후 n을 출력 후 공백으로 구분한다.
트러블 슈팅
없음
참고 사항
- 2^25개의 수를 8개의 비트를 포함하여 나타낼 것이니 버킷의 크기는 2^25 / 8로 설정하였다.
- 버킷의 한개의 인덱스에 8개의 수의 방문 여부를 저장할 수 있다. 비트가 켜져있으면 방문한 숫자이다.
정답 코드
#include<iostream>
using namespace std;
char bucket[(1 << 25) / 8];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n;
while (cin >> n) {
int idx = n / 8;
int bits = 1 << n % 8;
if (bucket[idx] & bits) continue;
bucket[idx] += bits;
cout << n << " ";
}
}
728x90
'알고리즘 공부 > C++' 카테고리의 다른 글
[G5] 백준 21775번 가희와 자원 놀이 C++ 구현, 시뮬레이션, 트리셋 (0) | 2025.07.08 |
---|---|
[G5] 백준 11578번 팀원 모집 C++ 비트마스킹, 백트래킹 (2) | 2025.07.08 |
[G2] 백준 2481번 해밍 경로 C++ 너비 우선 탐색, 비트마스킹, 해시맵, 역추적 (1) | 2025.07.06 |
[G2] 백준 17244번 아맞다우산 C++ 너비 우선 탐색, 비트마스킹 (0) | 2025.07.05 |
[G4] 백준 19538번 루머 C++ 너비 우선 탐색, 해시셋 (0) | 2025.07.03 |