기타

[C/C++] int 범위 초과 걱정 없이 코딩하는 방법 (int를 long long처럼 사용)

restudy 2022. 5. 13. 10:57
반응형

C 언어나 C++로 BOJ와 같은 Online Judge 사이트의 문제를 풀다보면 가끔 int 범위를 초과하는 입력 데이터 때문에 틀리는 경우가 있다.

이런 경우 int를 모두 long long으로 바꿔주는 것도 귀찮고 문제 풀 때마다 int 범위를 초과하는지 일일이 신경쓰는 시간이 아깝다.

그렇다고 항상 long long을 사용하자니 코드가 너무 더러워지고 typedef로 ll과 같은 자료형을 사용하자니 가독성이 떨어진다.

 

따라서 여기서는 평소와 같이 int로 코드를 작성하면서도 long long 범위로 정수 변수를 사용하는 방법을 소개하고자 한다.

** 참고로 내가 떠올린 방법이고, 최소한 BOJ에서는 제대로 동작하는 것을 확인했다.

 

 

int를 long long처럼 사용하는 방법

#include <bits/stdc++.h>
#define int long long
using namespace std;

main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL), cout.tie(NULL);

    int N; cin >> N;
    
    cout << N << "\n";
}

 

바로 define을 이용하여 위와 같이 해주면 된다.

using이나 typedef는 특정 데이터 타입을 다른 데이터 타입으로 선언할 경우 컴파일 에러가 발생한다.

그러나 #define을 사용하면 이러한 충돌없이 데이터 타입끼리의 선언이 가능하다.

 

따라서 이를 이용하여 #define으로 int를 long long으로 선언한다면, int a라는 코드는 사실 long long a라는 뜻으로 사용되는 것이다.

이제 위의 형식 코드를 양식과 같이 파일로 저장해놓고 문제를 풀 때마다 사용하면 된다.

 

 

주의할 점

** 메인 함수를 int main으로 선언할 경우 long long main이라는 함수가 되므로, 메인 함수의 리턴형 선언없이 그냥 main()으로 사용해주면 된다.

** CodeUp과 같은 사이트에서는 void main을 사용할 경우 제대로 채점하지 않는다고 한다. (물론 표준 gcc 컴파일러로는 문제가 없으나 CodeUp에서만 돌아가지 않는다는 것은, CodeUp 채점 프로그램이 문제가 있다는 것이다.)

 

 

 

작동 확인

 

#include <bits/stdc++.h>
#define int long long
using namespace std;

int f(int a, int b) {
    return a + b;
}

main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL), cout.tie(NULL);

    int a, b; cin >> a >> b;

    cout << f(a, b) << "\n";
}

 

위와 같은 코드를 돌려서 함수가 제대로 작동하는지 확인해보겠다.

 

 

 

int 범위를 넘어선 입력을 주어도 함수 f가 잘 작동하는 것을 확인할 수 있다.

 

 

 

또한 위와 같이 BOJ에 제출을 하여 정답 처리된 것을 통해 코드의 문법상 문제가 없음을 확인할 수 있다.

 

 

 

 

반응형