문제: if (백준 15549번)
문제 개요
문제는 주관식으로, 자바 코드 내에서 아래 조건을 만족하는 변수 x의 타입과 값을 찾는 것이다.
if (x != 0 && x == -x) {
System.out.println("true");
} else {
System.out.println("false");
}
조건 분석
조건을 만족하려면,
- x는 0이 아니어야 한다.
- x와 -x가 같아야 한다.
일반적인 수학에서는 (x = -x)이면 (x)가 0이 되어야 하지만, 여기서는 0이 될 수 없으므로 특별한 상황(오버플로우)를 고려해야 한다.
두의 보수와 오버플로우
자바의 정수형(int)은 두의 보수(Two's Complement) 방식으로 표현된다.
- int의 범위: (-2^{31}) ~ (2^{31}-1) 즉, (-2147483648) ~ (2147483647)
두의 보수에서는 최솟값 (-2147483648)의 부호를 바꾸면 (2147483648)이 되어야 하지만, 이 값은 int 범위를 초과하므로 오버플로우가 발생하고 결과는 그대로 (-2147483648)가 된다.
즉,
int x = -2147483648;
일 때,
- (x \neq 0) (당연히 (-2147483648 \neq 0))
- (-x = -(-2147483648) = -2147483648) (오버플로우 때문에)
따라서 (x == -x)가 성립한다.
'C++ > Algorithm' 카테고리의 다른 글
[C++] 백준/Gold/10986. 나머지 합 (0) | 2025.04.09 |
---|---|
[C++] 백준/Silver/1024. 수열의 합 (0) | 2025.04.08 |
[C++] 백준/Gold/1011. Fly me to the Alpha Centauri (0) | 2025.04.02 |
[C++] 백준/Platinum/1786. 찾기 (0) | 2025.03.28 |
[C++] LeetCode/Hard/0745-prefix-and-suffix-search (0) | 2025.03.25 |