★ solved.ac 난이도 : S5
(2021년 12월 29일 기준)
[문제 링크]
[문제 분석]
(프로그래밍에서) 0이 아니면서, '-'(부호)를 붙였을 때 같은 값이 되는 x를 찾는 문제
[풀이]
이 문제는 수학적 상식으로는 '답이 없을 것이다'라고 생각하기 쉬울 텐데요,
프로그래밍에서는 경우가 있습니다.
바로, '정수의 오버플로'가 발생하는 경우입니다.
먼저, 정답을 알려드리자면 'int -2147483648'입니다.
이 값은 -(2^31)이고, int 자료형이 나타낼 수 있는 가장 작은 값입니다.
반대로, 나타낼 수 있는 가장 큰 값은 2^31-1 = 2147483647입니다.
그 이유는, int 자료형은 32비트(=4바이트)가 할당되는데요,
0과 1로 이루어진 비트 32개로 표현할 수 있는 경우의 수는 2^32 = 4294967296가지입니다.
그렇다면 0과 음수는 어떻게 처리될까요?
그래서 4294967296을 반으로 나눈 2147483648가지를 음수에 할당합니다.
그리고 나머지 절반을 0과 양수에 할당합니다. (0이 있으므로 양수는 2^31-1 = 2147483647까지 가능하겠죠?)
즉, int 자료형이 나타낼 수 있는 정수의 범위는 -2147483648부터 +2147483647까지입니다.
(물론, C/C++에서는 앞에 unsigned를 붙여서 음수 범위를 없애고 양수 범위를 늘릴 수 있습니다. 기본값은 signed입니다.)
(현재는 C++에서 Java로 변경되었다고 합니다.)
만약, int로 선언된 변수 x에 -2147483648을 대입하고, 여기에 부호 '-'를 붙이면 어떻게 될까요?
수학적으로는 2147483648이 나올 것 같지만, 여기에서는 자료형의 범위가 초과됩니다.
이렇게 되면, 표현 가능한 최솟값부터 다시 표현하게 됩니다.
2147483648 = 2147483647+1이고, 1번째로 작은 값(가장 작은 값)이 -2147483648이므로, 결과적으로 -x = -2147483648이 됩니다.
그런데 x = -2147483648이므로, x와 -x는 서로 같은 수로 간주하게 됩니다.
따라서, 비교 결과는 "true"가 나오게 됩니다.
[소스 코드]
만약 틀린 부분이 있다면 지적 부탁드릴게요~! (댓글 환영!!)