마음만은 새내기

항상 초심을 잃지 않고 생활하겠습니다~!

프로그래밍/Baekjoon Online Judge

BOJ 15549번(if) 문제 풀이

동동매니저 2019. 1. 27. 21:35

★ solved.ac 난이도 : S5

(2021년 12월 29일 기준)


[문제 링크]

 

15549번: if

다음 프로그램을 실행시켰을 때, "true"를 출력하는 변수 x의 자료형과 값을 찾는 프로그램을 작성하시오. import java.util.*; public class Main { public static void main(String[] args) { ??? x = ???; if (x != 0 && x == -x)

www.acmicpc.net


[문제 분석]

(프로그래밍에서) 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"가 나오게 됩니다.


[소스 코드]

 

공유 소스 보기

 

www.acmicpc.net

만약 틀린 부분이 있다면 지적 부탁드릴게요~! (댓글 환영!!)