마음만은 새내기

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

프로그래밍/Baekjoon Online Judge

BOJ 15550번(if 2) 문제 풀이

동동매니저 2019. 1. 28. 08:54

★ solved.ac 난이도 : G4

(2021년 12월 29일 기준)


[문제 링크]

 

15550번: if 2

첫째 줄에 변수 a의 자료형과 값, 둘째 줄에 변수 b의 자료형과 값, 셋째 줄에 변수 c의 자료형과 값을 공백으로 구분해 출력한다. 자료형은 int, long long, float, double만 가능하다. 출력한 값이 자

www.acmicpc.net


[문제 분석]

(프로그래밍에서) a와 b가 같고, b와 c도 같으면서 a와 c가 다른 세 개의 값을 찾는 문제


[풀이]

이 문제는 기묘하게도 a, b가 같고, b, c도 같으면서 a, c가 다른 세 개의 값을 찾아야 합니다.

이 문제 역시 15549번 문제처럼 수학적으로는 '답이 없다'라고 생각되실 겁니다.

이 문제 역시 프로그래밍으로 하시면 답이 있습니다.

풀이에 앞서, 예시 정답을 먼저 알려드리겠습니다.

더보기

a = 'int 99999998'

b = 'float 99999998'

c = 'int 99999999'

여기에서 실수의 2진수 인코딩 방법을 설명드리겠습니다.

float 자료형은 부호 1비트, 지수부 8비트, 가수부 23비트로 이루어져 있습니다.

인코딩 방법은, b = 2^(n-1)-1 (n = 지수부의 비트 수)를 구하고, 2진수 소수점으로 표현된 m(가수부)의 값을 구하고, 이를 토대로 e(지수부)의 값을 구합니다.

그리고 e+b의 값을 구합니다. (이를 exp라고 하겠습니다. exp = 8비트)

또, 2진수로 표현된 소수점 아래 부분을 frac라고 하겠습니다. (frac = 23비트, m = 1.(frac))

그리고 부호 1비트 + 지수부 8비트 + 가수부 23비트를 붙이면, 인코딩이 완료됩니다.

여기에서는 99999998을 사용했는데요, 이를 2진수로 변환해보겠습니다.

먼저, 99999998 (10진수) = ‭101 1111 0101 1110 0000 1111 1110‬ (2진수)로 변환됩니다.

이를 다시 변환하면,

1.01111101011110000011111110 (2진수) x 2^26가 됩니다.

여기에서 b = 127 ( = 2^(8-1)-1), m = 1.01111101011110000011111110 (2진수), e = 26으로 설정하겠습니다.

(참고로, b의 값을 설정하는 이유는, e의 값이 음수인 경우 보정을 위해서입니다. 또, e가 0이거나 표현 가능한 최댓값인 경우는 복잡해집니다.)

exp(지수부) = e+b = 26+127 = 153이 되고,

frac = 01 1111 0101 1110 0000 1111 1110 (2진수)가 되지만, 소수점 아래가 26비트이므로, 가장 근접하게 23비트로 잘라냅니다.

그러므로, 011 1110 1011 1100 0001 1111(뒤의 110은 버려짐)에서 가장 근접한 011 1110 1011 1100 0010 0000 (2진수)가 됩니다.

결과적으로, ‭0100 1100 1011 1110 1011 1100 0010 0000‬ (2진수)가 됩니다.

99999999에 대해서도 마찬가지로 이러한 결과를 얻을 수 있습니다.

즉, 'float 99999998'과 'float 99999999'는 같은 값이 들어가게 됩니다.

이는 소수점의 정밀도와 관련이 있습니다.

float의 경우, double에 비해 정밀도가 떨어집니다.

또한, int 자료형과 float 자료형을 서로 비교할 때, int가 float로 형 변환되어서 비교가 됩니다.

(int (정수형)보다 범위가 넓은 float (실수형)로 변환되죠.)

int 99999999, float 99999998을 비교하면 true를 돌려주는 이유가 바로 그것입니다.

(int 99999999 -> float 99999999 == float 99999998처럼 되는 것입니다.)

 

복잡하고 긴 글 읽어주셔서 감사합니다~! (꾸벅...)


[소스 코드]

 

공유 소스 보기

 

www.acmicpc.net

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