탐색시간의 블로그


처음에 이 문제를 접했을때


당연히 48÷2(12) 에서


나누기, 곱하기에서 먼저 나온것 부터 계산하면


24(12) = 288 이네. 단순하게 생각 했다.



그런데, 오늘 아침 신문에 보니깐

이대 수학과 출신 곽현화씨가 정답이 2라고 한다.


수학문제 48÷2(9+3)의 답이 2

곽현화의 설명에 따르면 2(9+3)은 곧 2에 12를 곱한 값과 등가 관계이므로 결과는 24이다. 따라서 문제는 48÷24로 나타낼 수 있고 답은 2가 된다. 다시 말해 문제에서 곱하기가 생략돼 있어 2(9+3)을 한 덩어리로 봐야 한다는 것.

48÷2*(9+3)의 답은 48을 2로 나눈 값인 24에 12를 곱해야 하므로 288이다. 이 문제와 같이 곱하기 모습이 있으면 순차적으로 계산해서 288이 된다는 설명이다


     

그래서, 우리직원에게 물어 봤다.

48÷2(9+3) = 2, 48÷2*(9+3) = 288 이라고 하는데,

분배의 법칙, 치환의 법칙을 사용하면 그때 그때 2 또는 288이 다르게 나온다는 것이다.


일종의 이것도 유사하다.

1/3은 0.33333... 무한대이다.  1/3+1/3+1/3 = 1이다. 하지만, 0.33333...+0.3333...0.3333=0.999999

결국 1 = 0.99999...는 같아진다는..




그런데, 이때 우리 개발팀에서 하는 말이다.

컴퓨터는 분배법칙, 치환법칙 모른다. 다만, 가감승제에 의거한 연산자 우선의법칙에 따라 연산할 뿐이라고

 [ 컴퓨터 자료 구조의 개념 ]

# Infix 표기를 Prefix로 바꾸기

X = A / B * (C + D) + E

--> (X = ((A / B) * (C + D)) + E))   연산 우선순위에 따라 괄호로 묶는다.

--> = (X +( *( /(A B) + (C D)) E)    연산자를 해당 괄호의 앞으로 옮긴다.

--> = X + * / A B + C D E               괄호를 제거한다.


# Infix 표기를 Postfix로 바꾸기

X = A / B * (C + D) + E

--> (X = ((A / B) * (C + D)) + E))   연산 우선순위에 따라 괄호로 묶는다.

--> (X ((A B) / (C D) +) * E) +)=    연산자를 해당 괄호의 앞으로 옮긴다.

--> X A B / C D + * E + =               괄호를 제거한다.


# Postfix 표기를 Infix로 바꾸기

A B C - / D E F + * + 

--> ( (A (B C -) /) (D (E F +) *) +) 인접한 피연산자 두 개와 오른쪽의 연산자를 괄호로 묶는다.

--> ( (A / (B - C) + (D * (E + F) ) ) 연산자를 해당 피연산자의 가운데로 이동시킨다.

--> A / (B - C) + D * (E + F)          필요 없는 괄호를 제거한다.


# Prefix 표기를 Infix로 바꾸기

+ / A - B C * D + E F

--> (+ (/ A (- B C)) (* D (+ E F))) 인접한 피연산자 두 개와 왼쪽의 연산자를 괄호로 묶는다.

--> ((A / (B - C)) + (D * (E + F))) 연산자를 해당 피연산자의 가운데로 이동시킨다.

--> A / (B - C) + D * (E + F)        필요 없는 괄호를 제거한다. 



[ 연산자 우선순위 ]

연산자      연산자의 역할         수행 방향

---------------------------------------------------------------

()        우선 순위           Left -> Right
++        전위 증분           Left -> Right
--        전위 감량           Left -> Right
++        후위 증분           Right -> Left
--        후위 감량           Right -> Left
~         보수              Right -> Left
!          Not              Right -> Left
&         Address            Right -> Left
*        Indirection            Right -> Left
*         곱셈             Left -> Right
/         나눗셈            Left -> Right
%          나머지            Left -> Right
+         덧셈             Left -> Right
-         뺄셈             Left -> Right
<< , >>      Shift             Left -> Right
==,!=       비교              Left -> Right
& , ^,|       bit 연산자           Left -> Right
&& , ||      논리 연산자          Left -> Right
=         할당            Right -> Left
*=        곱셈 후 할당         Right -> Left
/=        나눗셈 후 할당        Right -> Left
+=        덧셈 후 할당         Right -> Left
-=        뺄셈 후 할당         Right -> Left
<< =, >>=     shift 후 할당           Right -> Left
& =, |=, ^=      bit 연산 후 할당        Right -> Left
,          comma          Left -> Right



 위에 표와 같이 컴퓨터는

48÷2(12) 의 의미는 48 연산자 2 괄호 12 괄호 하고 판단하다고, 따라서 결과는 2로 출력될 가능성이 높다고

간단히  말해 2(12) 사이에는 명확한 연산자가 없는 버그를 어떻게 처리하냐가 관건이라고..





제가 보유한 공학용 계산기로 테스트한 결과는 

Casio FX-570ES  48÷2(9+3), 48÷2*(9+3) 모두 288이 정답이라고 나타납니다.
Sharp EL-509V   48÷2(9+3)의 답은 2, 48÷2*(9+3)의 답은 288로 다르게 출력된다.

 

 

 

 


 


또한 엑셀의 경우 48÷2(9+3) 입력하면,

 


수식 오류가 나타면서 48÷2*(9+3) = 288로 출력해준다.

(개발팀에서 말한 연산자 버그를 표시하는 것 같은 모습니다.)


종합적인 내용으로 내가 판단하는 결론은

48÷2(9+3)의 답은 2   <- 사람들은 2(9+3)을 한묶음로 생각하는 경우가 많다.

48÷2*(9+3)의 답은 288이다.

다만, 사람이 볼때와 컴퓨터가 연산할때 가감승제 우선순위는 틀리다는 것이다.

Posted by 씨크타임