x가 0이 아니면서, x와 -x가 같은 경우 ?
https://www.acmicpc.net/problem/15549
백준 15549번.
위 코드에서 true를 출력할 수 있도록 변수 x의 자료형과 값을 찾으라는 문제였습니다. (단 자료형은 int, long 중 하나)
true를 출력하려면... x랑 -x랑 같아야 하나, x는 0이 아니다.
???????????????????????????
x랑 -x랑 같은 건 0 밖에 없지 않나?
0이 아니면서 x와 -x가 같은 수가 있나?
흠... 아무래도 이 문제는 수학적으로 접근하면 풀 수 없고, 컴퓨팅 사고로 접근해야 풀 수 있을 것 같습니다.
1, -1
2, -2
.
.
1000, -1000 등 대부분 숫자를 대입해봐도 x == -x => true를 만족하지 않습니다
하지만, 숫자가 매우 커졌을 때, 값이 변화하는 구간이 있습니다. 바로 오버플로우 / 언더플로우 구간입니다.
int 형의 범위
-2,147,483,648 ~ 2,147,483,647
int형의 최솟값은 -2,147,483,648 이고, 최댓값은 2,147,483,647 입니다.
int형은 32개의 비트로 표현되며, 때문에 2^32 (=4,294,967,296) 개의 값을 표현할 수 있기 때문입니다.
절반인 2,147,483,648개를 음수를 표현하는 데 쓰고, 나머지 절반을 0과 양수를 표현하는데 사용합니다.
양수의 표현 범위가 음수보다 1 만큼 작은 이유는, 0을 표현하기 때문입니다.
그럼, int x 에 -2,147,483,648을 대입해봅시다.
-x를 하면 어떻게 될까요? 2,147,483,648 이 됩니다.
int 형의 최대 표현 범위인 2,147,483,647을 벗어났습니다.
따라서 이는 오버플로우(overflow)를 일으켜, int형의 최솟값인 -2,147,483,648이 됩니다.
-x를 했는데 처음 그 수 그대로가 됬습니다.
int 자료형 중, 0이 아니면서 x와 -x가 같은 수를 찾았네요.
마치며
문제를 이해하는데 꽤 걸렸던 것 같습니다.
아니 정확하게는 문제를 이해했지만, 내가 이해한게 맞나? 하면서 문제를 반복해서 읽느냐고 생각보다 시간이 걸렸습니다.
0아 아닌 수 중, x와 -x가 같은 수를 찾아라.
수학적으로 접근하면 풀 수 없고, 컴퓨팅 사고로 접근해야 풀 수 있는 문제였네요.
파이썬을 주로 사용하는 사람들은 더 어렵지 않았을까 싶기도 합니다.
생각할 거리를 하나 던져 준 듯한 재밌는 문제였던 것 같네요.
'기타' 카테고리의 다른 글
유클리드 거리와 맨해튼 거리 (0) | 2023.08.21 |
---|---|
파이썬과 코틀린의 for문이 C, 자바의 for문과 다르게 생긴 이유 (feat. 부수효과(side-effect)) (0) | 2023.08.08 |
라이브러리와 프레임워크의 공통점과 차이점 (0) | 2023.08.04 |
노션 API를 사용해보자! (feat. 포스트맨) (0) | 2022.06.27 |
ASKII(아스키 코드)를 이용한 문자출력 (0) | 2022.02.16 |