skins346   6년 전

파도반 수열 문제를 풀면서 dp 변수로 int d[101]를 사용해서 계속 틀리더라고요. long long을 사용하니까 맞았는데.

long long이 int 보다 더 높은 수를 나타낼수 있는다는 차이점은 알고있는데 

언제 이 두개를 구분해서 써야하는 기준이 뭘까요?? 

파도반 수열 문제를 예로 설명해 주실 수 있나요?

gallopsys   6년 전

정수 자료형 int는 32/64비트 환경에 상관없이 4바이트의 정보를 기록할 수 있는 자료형입니다. signed int(부호가 있는 정수)를 기준으로 기록할 수 있는 양의 정수 범위는 0 ~ 2,147,483,647(16진수로 7FFFFFFF)인데요.

파도반 수열을 예로 들면 N = 79부터 이 int로 계산할 수 있는 범위를 넘어서게 됩니다. 이를 산술 넘침 혹은 Overflow라고 하지요. 그래서 4바이트의 저장 공간만으로는 좀 더 큰 정수를 계산할 수 없게 되었고, 점점 커져가는 메모리 공간, 계산량에 어느 정도 대비할 필요가 있게 되었습니다. 따라서 1999년도 C언어 표준안(C99)에서 8바이트의 크기를 가지는 정수 자료형 long long이 소개되었고, C++은 2011년도 C++ 표준안(C++11)에서 이 자료형을 지원하게 되었죠. long long은 8바이트의 공간을 가지는 자료형이기에 signed long long을 기준으로 하면 최대 계산할 수 있는 양의 정수 범위는 0 ~ 9,223,372,036,854,775,807(16진수로 7FFFFFFFFFFFFFFF)가 되어 파도반 수열에서 보였던 문제를 해결할 수 있게 된 것입니다.

옆의 링크는 C++11의 long long 자료형에 대한 간단한 Wikipedia 내용인데, 참고하실 일이 있으면 참고해보시길 바랍니다 :) https://en.wikipedia.org/wiki/...


주로 int와 long long을 구분하며 사용하실 땐, 주어지는 입력값의 범위를 고려해보시고 그 값이 int로 표현이 불가능한 값이면 long long, long long으로도 불가능하면 BigInteger를 건들면 크게 문제를 해결하는데 애로사항은 없으실 겁니다.

skins346   6년 전

아 정말 상세한 답변 감사드립니다!!

오늘도 하나 배우고 가네요. 

댓글을 작성하려면 로그인해야 합니다.