본문 바로가기
Portpolio/codingtest

백준 2338 : c++에서의 int의 크기와 python의 big integer형

by Peter Choi 2023. 11. 1.
반응형

알고리즘 문제를 풀다보면 언뜻 쉬워보이는데 정작 틀렸다는 글들이 많다.

 

이번 2338번 문제도 그것과 관련이 깊다.

 

코드 제출만 놓고 보면 그냥 별거 아닌 브론즈5 티어 문제인데 그 속에 담겨있는 컴퓨터 구조적 지식이 중요하다고 생각한다.

 

우선 내가 그걸 모르고 무심코 쓴 c++ 코드를 보면,

 

#include <iostream>

int main(void)
{
    int a, b;
    
    std::cin >> a;
    std::cin >> b;
    std::cout << a + b << std::endl;
    std::cout << a - b << std::endl;
    std::cout << a * b << std::endl;

    return 0;
}

 

이지만, 문제의 조건을 다시 읽어보자.

긴자리 계산 성공

 
시간 제한        메모리 제한                  제출                        정답맞힌 사람                                       정답 비율

 

2 초 128 MB 32895 14104 13174 50.406%

문제

두 수 A, B를 입력받아, A+B, A-B, A×B를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 A가, 둘째 줄에 B가 주어진다. 각각의 수는 10진수로 1,000자리를 넘지 않으며 양수와 음수가 모두 주어질 수 있다.

출력

첫째 줄에 A+B, 둘째 줄에 A-B, 셋째 줄에 A×B를 출력한다. 각각을 출력할 때, 답이 0인 경우를 제외하고는 0으로 시작하게 해서는 안 된다(1을 01로 출력하면 안 된다는 의미).

예제 입력 1 복사

1
-1

예제 출력 1 복사

0
2
-1

입력에서 1,000자리를 넘어가면 안된다고 한다.

 

그러나 c,c++에서 10진수로 1,000자리를 넘지 않아야 한다고 한다. 

 

signed int는 기본적으로 -21억 ~ 21억이다. 

unsigned int라도 0~42억을 벗어나지 않는다.

 

즉, c나 c++에서 쓰는 int는 10진수에서 10자리를 넘어가지 않는다. 1,000자리를 입력받기는 아무리 생각해도 힘들다.

 

문제를 풀때는 이러한 사소한 컴퓨터의 구조적 문제를 보면서 생각을 해야 하는데, 생각하지 않으면 안되는 상황도 있다.

 

그래서 결국 python으로 코드를 짜서 제출하니 성공했다.   

 

문제에서 그 범위를 넘게 정해놨다면 아무리 쉬운 문제도 고려해야 할 사항이 많아진다.

 

A = int(input())
B = int(input())

print(A+B)
print(A-B)
print(A*B)

 

>> 이렇게 간단하다. 사실 코드보다 문제의 조건에서 생각하게 하는 부분이 신경써야 하는 부분인 것 같다.

반응형

댓글