코테를 좀 풀다 보면 항상 ㅎㅇㅎㅇ 오늘도 또 왔슈 하고 나오는 조건들이 있다.
그 중 하나가 바로 int
범위 한정으로 숫자가 들어온다는 것이다.
가령, 문제에서 어떤 수 x가 들어온다고 하면서 x는 $-2^{31}$보다 크거나 같고 $2^{31}$보다 작다 라는 말이 붙을 때가 있는데, 이걸 말하는 것이다.
사실 그냥 이럴 경우 그래 input 받는 변수를 int
로 해도 되겠구나 라고 int
타입 변수 선언하고 끝나면 된다.
그런데, 오늘은 max heap을 구현하다가 진짜로 INF를 숫자로 선언할 일이 있어서 약간 띠용했다.
$-2^{31}$이나 $2^{31}$을 어떻게 선언해야 할까?
원시적인 방법부터 스마트해보이는 방법 순으로 살펴보자. 목차는 다음과 같다.
- 암기빵 먹기
- 조금 쌈빡한 암기빵 먹기
- pow 함수 이용하기
- library macro 사용하기
암기빵 먹기
순수하게 암기빵을 먹어서 능력을 발휘해도 된다.
$2^{31}$은 2147483648 이고, $-2^{31}$은 -2147483648이다.
원하는 변수에 해당 숫자를 때려 박으면 만사 오케이다.
장점
- 암기빵 장인..?
단점
- 숫자 하나 틀리면 안녕히계세요 여러분
조금 쌈빡한 암기빵 먹기
사실 $2^{31}$은 bit로 따졌을 때, 나머지는 다 0이고 $2^{31}$ 자리만 1인 수이다. 이를 bit로 암기하는건 좀 오바이고, 16진수로 외우면 좀 편하다.
$2^{31}$은 16진수로 나타내면 0x7FFFFFFF 이고, $-2^{31}$은 16진수로 나타내면 0x80000000 이다.
장점
- 아까 전의 암기빵보다는 외우기 쉬움
단점
- 입력할때마다 하나둘셋넷다여일곱 이러면서 세어봐야 함
pow 함수 이용하기
C
에는 <math.h>
로, C++
에서는 <cmath>
의 이름을 가진 라이브러리가 있다.
그 중에서 pow(int a, int b)
함수는 $a^{b}$ 계산을 해 주는 함수이다. 자세한 설명은 cpluscplus.com-pow를 참고하자.
pow
함수는 다음과 같이 사용할 수 있다.
int min = pow(-2, 31);
int max = pow(2, 31)-1;
printf("%d %d\n",min, max);
/**
* 출력 결과
*
* -2147483648 2147483647
*
*/
int
범위가 $-2^{31}$부터 $2^{31}-1$이기 때문에, max
를 지정할 때는 -1을 해 줬다. 만약, -1을 해 주지 않으면 overflow가 일어난다.
장점
- 익숙한
<cmath>
라 가장 쉽게 떠올릴 수 있는 방법이다.
단점
- 사실 얘는 진짜 거듭제곱승을 계산하는 함수라, 시간이 걸리긴 한다.
우리 눈엔 안보이지만
library macro 사용하기
어떤 데이터 타입의 max 값과 min 값은 많이 참조되는 값이기 때문에, 사실 얘네를 싹 다 macro로 모아놓은 library가 따로 있다.
해당 라이브러리의 이름은 C
에서는 <limits.h>
라이브러리이고, C++
에서는 동일한 라이브러리를 <climits>
로 불러와서 사용할 수 있다.
C Library - <limits.h> 여기를 참조하면 다양한 데이터 타입들의 min, max macro들을 확인할 수 있다.
macro는 다음과 같이 사용할 수 있다.
printf("%d %d\n", INT_MIN, INT_MAX);
/**
* 출력 결과
*
* -2147483648 2147483647
*/
장점
- 쉽다, 빠르다, 라이브러리 이름도 쉽다!
#define
에서도 얼마든지 사용할 수 있다!
단점
- 단점이 뭐가 있을까요
진짜 물어보는거임
결론으로, 나는 라이브러리 제한이 있는 경우가 아니라면 그냥 <climits>
라이브러리를 쓰련다.
'잡다한 지식 > CS 베이스' 카테고리의 다른 글
[프로그래밍언어론] 객체지향 프로그래밍 언어의 특징 (0) | 2021.03.26 |
---|---|
[Data Structure] Heap (0) | 2021.03.19 |
#define 의 함정... 나만 빠짐 (1) | 2021.03.19 |
[Data Structure] Priority Queue (우선순위 큐) (0) | 2021.03.19 |
row-major (행 우선), column-major(열 우선)가 왜 중요한가? (1) | 2021.03.19 |