잡다한 지식/CS 베이스

정수 범위 무한대 입력 방법

GGOBOOGI 2021. 3. 19. 17:21
반응형

코테를 좀 풀다 보면 항상 ㅎㅇㅎㅇ 오늘도 또 왔슈 하고 나오는 조건들이 있다.

 

그 중 하나가 바로 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> 라이브러리를 쓰련다.

반응형