Uknow's Lab.
article thumbnail

 

 

 

x가 0이 아니면서, x와 -x가 같은 경우 ?

https://www.acmicpc.net/problem/15549

 

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

 

백준 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가 같은 수를 찾아라.

수학적으로 접근하면 풀 수 없고, 컴퓨팅 사고로 접근해야 풀 수 있는 문제였네요.

파이썬을 주로 사용하는 사람들은 더 어렵지 않았을까 싶기도 합니다.

 

생각할 거리를 하나 던져 준 듯한 재밌는 문제였던 것 같네요.

profile

Uknow's Lab.

@유노 Uknow

인생은 Byte와 Double 사이 Char다. 아무말이나 해봤습니다.