티스토리 뷰
대부분의 PS 문제를 해결할 때에는 보통 메모리 제한보다는 성능을 더 고려한다. 처음부터 메모리가 넉넉하게 주어지며, 사실 기술이 많이 발전한 지금 메모리를 극한으로 제한하는 것은 어불성설인 것 같기도 하다.
하지만 PS 문제에서 메모리를 제한할 때, 알아두면 좋을 방법이니 포스팅해보도록 한다.
| 사용되지 않는 비트의 예시
1. 입력 값으로 주어진 수의 범위가 제한적일 때
예를 들어, 특정 문자열이 주어지고, 그 문자열의 길이를 저장해야 할 때 보통
int len = str.length();
이런 식으로 사용하곤 하는데. 만약 주어진 문자열의 길이가 8 이하라면? 100 이하라면? 위의 Integer type변수 len의 앞쪽 비트는 전혀 사용되지 않는다.
다시말해 만약 문자열의 길이가 8 이하라면, 단 3bit로 표현이 가능하고 100 이하라면 7bit로 표현이 가능하다.
2. 입력 값으로 영문 소문자 혹은 대문자만 주어질 때
한글은 2byte로 표현이 되고, 영문 및 특수문자는 1byte로 표현이 된다. 만약 어떤 프로그램의 입력이 영문 소문자 혹은 대문자로만 이루어져 있다면, 1byte 전부를 쓸 필요는 없다. 1byte는 8bit로 숫자 0부터 255까지 표현이 가능하고, 영문자는 단 26개이기 때문에 5bit를 사용하여 각 영문자를 mapping 한다면 전부 표현이 가능하다.
| 데이터를 비트단위로 메모리에 차곡차곡 쌓기
위의 1,2번 내용은 어려운 내용이 아니다. 입력 값이 제한되어 있다면, 당연히 그 입력값을 표현하는데 필요한 비트도 적을 것이다.
Int len = str.length();
위의 코드에서 문자열의 길이가 최대 100이라면 숫자 100 이하로 표현이 될 것이고, 어차피 32bit 중 7bit만 사용이 될 것이다. 값 자체는 아무런 영향이 없고 값을 담는 바구니에 따라 낭비되는 비트가 있다/없다로 나뉘는 것이다. 즉, 이말은 바구니가 int가 아니라 char를 쓰더라도 1bit가 낭비가 될 것이다.
그렇다면 어떻게 해야 메모리 낭비 없이 모든 데이터를 저장할 수 있을까? 답은 직관적이다. 그냥 필요한 비트까지만 쓰고 다음 비트는 다른 데이터로 채우는 것이다. 아래는 메모리에 필요한 데이터를 차곡차곡 쌓는 코드이다.
using UI = unsigned int;
void write(char*str, int idx, int val) {
*((UI*)(str + (idx >> 3))) |= val << (idx & 7);
}
void read(char*str, int idx, int bitLen) {
UI target = *((UI*)(str + (idx >> 3))), mask = (1 << bitLen) - 1;
return (tg >> (idx & 7)) & mask;
}
읽기는 쓰기의 반대이니 쓰기만 설명하자면, 메모리를 바이트 단위로 채운다고 하면 1 byte가 8 bit이기 때문에, 몇 번째 byte부터 채울지 정해야 한다. 그러한 코드가 str + (idx >> 3) 부분이다. 오른쪽으로 3번 shift는 나누기 8과 같다.
몇 번째 byte부터 채울지가 정해진다면 그 byte의 몇 번째 bit부터 쓸지를 정해야 하는데 그 코드가 val << (idx & 7) 이 부분이다. & 7은 % 8과 같다. 이런 식으로 해주면 사용 안 하는 비트 없이 필요한 데이터를 모두 채울 수 있다.
'IT > C, C++' 카테고리의 다른 글
[컴퓨터 아키텍쳐] 부동소수점의 개념 (0) | 2023.07.17 |
---|---|
[C] 함수포인터 기초 (0) | 2023.07.16 |
[C++] C++의 가상함수 동작 원리 (0) | 2022.09.16 |
[C/C++] Hash Table vs STL map (0) | 2022.09.15 |
Google C/C++ CodeStyle (0) | 2022.08.12 |
- Total
- Today
- Yesterday
- 트리
- 기술면접
- 자료구조
- 러스트 입문
- Problem Solving
- DP
- C++
- Interview
- 맛집
- 내돈내산
- 러스트 배우기
- algorithm
- 러스트 기초
- Medium
- 반드시 알아야 할 자료구조
- LeetCode
- Tree
- 속초
- 알고리즘
- interview question
- coding interview
- 리트코드
- PS
- ProblemSolving
- 속초 맛집
- rust
- 러스트
- 인터뷰
- 코딩인터뷰
- 솔직후기
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |