혼합 계산
1. 개요
mixed calculation · 混合 計算
한 식에 덧셈과 뺄셈, 그리고 곱셈과 나눗셈 중 각각 적어도 하나씩 나오는 계산을 말하며 대한민국 교육과정에서는 초등학교 4학년부터 배운다.[1]
이후 고등학교 과정에서 [2] 여러 가지 특수 연산자가 추가된 혼합 계산이 가끔씩 등장한다.
2. 계산 방법
초등적인 관점에서 보면 우선순위는 다음과 같다.
대표적인 예시로, 작렬 정신통일의 전설의 짤방 두뇌풀가동에 쓰인 2+2×2는 곱셈이 덧셈보다 우선순위가 높기 때문에 곱셈을 먼저하고 덧셈을 나중에 계산하므로 2+2x2=6이 된다.
거듭제곱 계산이 있을 경우 곱셈, 나눗셈보다 가장 먼저 계산한다. 제곱근도 사실상 1/2제곱과 같기 때문에 거듭제곱과 같은 우선순위를 가진다. 지수의 역연산인 로가리듬 역시 마찬가지. 함수는 특성상 가장 나중에 계산하게 된다. 켤레는 괄호와 같다.
동등한 우선순위를 가지는 연산의 경우는 순서대로 계산하며 왼쪽에서 오른쪽으로 계산한다. 예를 들어 덧셈과 뺄셈만 있는 식은 왼쪽부터 놓인 순서대로 계산한다. 곱셈과 나눗셈만 있는 식도 동일하다.
위의 순서가 특히 중요한 연산이 다름아닌 벡터와 델, 그리고 행렬. 이쪽은 곱셈의 교환법칙을 씹어버리기 때문에 순서가 틀릴 경우 그야말로 계산이 나락으로 빠져버린다.
2.1. 혼합 계산식의 변환
혼합 계산식을 다른 식으로 변환하여 계산을 편리하게 할 수 있다. 결합법칙과 분배법칙은 사칙연산 및 집합, 논리 연산에서 모두 적용된다. (a, b, c, x1, ..., xn, y1, ..., yn은 상수)
- 결합법칙, 분배법칙
- 결합법칙으로 괄호의 위치를 바꿀 수 있다는 것을, 분배법칙으로는 (a+b)×c뿐만 아니라 이 식에서 +를 -로, ×를 ÷로 바꾼 식의 변환도 설명할 수 있다.
- 곱셈 공식, 인수분해 공식
- 덧셈, 뺄셈이 복잡하게 섞여 있는 식은 교환법칙을 이용하여 x1+x2+...+xn-y1-y2-...-ym=(x1+x2+...+xn)-(y1+y2+...+ym)으로 정리할 수 있다.
- a-(b-c)=a-b+c=(a+c)-b, a÷(b÷c)=a÷b×c=ac÷b
- a-(x1+x2+...+xn)=a-x1-x2-...-xn
- a-(x1+x2+...+xn-y1-y2-...-ym)=a-x1-x2-...-xn+y1+y2+...+ym=(a+y1+y2+...+ym)-(x1+x2+...+xn)(y1, ..., ym은 상수)
- a에서 괄호의 식을 뺀다는 의미이므로 괄호를 벗길 때 부호를 바꾸면 된다. 거의 당연하다고 할 수 있다. 이때, 괄호 안에 +와 - 기호가 복잡하게 섞여 있는 경우, +에 해당하는 부분을 왼쪽에, -에 해당하는 부분을 오른쪽에 놓으면 이 식을 적용할 수 있다.
- a÷(x1x2...xn÷y1÷y2÷...÷ym)=a÷x1÷x2÷...÷xn×y1y2...ym=(ay1y2...ym)÷(x1x2...xn)(y1, ..., ym은 상수)
- 위 식에서 +를 ×로, -를 ÷로 바꾼 것이다.
- a÷(x1x2...xn)=a÷x1÷x2÷...÷xn
- (x1+x2+...+xn)-(y1+y2+...+yn)=(x1-y1)+(x2-y2)+...+(xn-yn)
- xk-yk의 값이 일정하거나 0인 경우에는 이 방법으로 수식을 정리하면 편리하다. 이를 응용한 것 중 하나가 바로 망원급수이다.
- (x1x2...xn)÷(y1y2...yn)=(x1÷y1)(x2÷y2)...(xn÷yn)
- 분수의 곱셈 공식이 이를 응용한 것이라고 할 수 있다.
- 드 모르간의 법칙 - 논리 연산, 집합 한정
2.2. 괄호가 있는 경우
괄호를 사용하는 경우, 위에서 언급된 어느 연산보다 가장 높은 우선순위로 계산한다. 예를 들어 2+2x2 = 6 이지만 (2+2)x2 인 경우는 괄호를 먼저 계산해서 8이 된다.
엄밀히 따지면, 모든 연산마다 일일이 다 괄호를 쳐야 맞지만, 표기의 편의상 괄호를 생략한 것 뿐이다. 실수 내에서 단순한 덧셈과 곱셈이라면 결합법칙이 성립하기에 괄호를 생략할 수 있게 된다. (a+b)+c = a+(b+c) 이기 때문에, 굳이 괄호를 표기할 필요 없이 a+b+c 로 표기한 것이다. 또한, 곱셈을 덧셈보다 먼저 계산한다는 약속이 있기 때문에 a + (b x c) 라고 굳이 쓸 필요 없이 a + b x c 로 표기할 수 있으며, 곱셈기호 마저 점만 찍거나 생략해서 a + b·c 로 쓰거나 a + bc 로 표현한다. 여기서 b와 c가 모두 기호가 아닌 수일 때는 점을 찍어서 표기할 수는 있지만 생략하지는 않는다.
수와 괄호로 묶인 식 사이에 곱셈 기호를 생략하는 것을 허용한다면 논란이 발생할 수 있다. 대표적인 사례가 바로 48÷2(9+3).
괄호가 여러 개 중첩된 경우 안에 있는 괄호를 먼저 푼다. 초등학교 수준에서는 편의상 소괄호 → 중괄호 → 대괄호 순서로 계산한다고 알려 주지만, 일반적으로 소괄호만 중첩해서 사용한다. 참고로, 대한민국의 수학 교육 과정에서는 소괄호-중괄호-대괄호 순의 위계질서가 있지만, 미국의 수학 교육 과정에서는 중괄호가 존재하지 않는다. 즉, 바로 소괄호 다음이 대괄호이다. 미국에서 중괄호는 수학이 아닌 프로그래밍 등의 분야에서 주로 쓴다.
전체 식 또는 괄호 안의 식에서, 괄호가 중첩되지 않으면서 여러 개 있는 경우 또는 중첩된 괄호를 풀어 그렇게 만든 경우에는 어떤 괄호를 먼저 계산하는지에 따라 결과값이 달라지지는 않지만 일반적으로 왼쪽에 있는 괄호부터 푼다.
2.2.1. 괄호를 먼저 계산하지 않아도 되는 경우
괄호가 있는 식에서 괄호를 먼저 계산하지 않아도 올바른 결과가 도출되는 경우도 있는데, 예를 들면 다음과 같다. 사칙연산의 경우는 다음과 같다.
- 사칙연산 기호 중 덧셈만 있거나, 곱셈만 있는 경우: 덧셈과 곱셈은 결합법칙이 성립하므로 상관없다. 심지어 괄호의 위치를 변경해도 된다.
- 덧셈, 뺄셈 기호로 구분되는 항이 중간에 괄호 없이 2개 이상 연속되는 경우: 예를 들어 $$(6+3)\times5+4+2$$의 경우, 5와 4 사이의 + 기호를 기준으로 왼쪽과 오른쪽을 서로 독립적으로 계산해도 되므로 $$4+2$$를 먼저 계산해도 된다. 여기서는 4, 2가 그 항이다.
- 단, (괄호)-a+b(a, b는 상수) 식으로 구성된 경우, a+b를 먼저 계산하면 결과적으로 (괄호)-a-b가 되므로 계산이 틀리게 된다.
- 괄호 부분과 괄호 밖의 곱셈식이 덧셈, 뺄셈 기호로 연결되어 있는 경우: 예를 들어 $$(1+2)\times3+4\times5$$의 경우, 3과 4 사이의 + 기호를 기준으로 양쪽이 서로 독립적이므로 $$4\times5$$를 먼저 계산해도 된다.
더 일반적인 경우로 확장하여, 두 연산 ☆, ◇에 대하여 ☆이 ◇보다 우선한다고 하면 아래 경우에는 괄호를 먼저 계산하지 않아도 된다.
- ☆가 결합법칙이 성립하는 연산일 때, 식 내의 모든 연산 기호가 ☆인 경우
- 괄호가 아닌 부분의 식과 괄호 부분의 식이 ◇로 연결된 경우. 예를 들어 1☆2◇3☆(4◇5)의 경우, 괄호 밖에 있는 1☆2를 먼저 계산해도 상관없다.
2.3. 논리식의 계산
논리합(OR)과 논리곱(AND)을 이용한 논리식의 계산에서는 논리 부정(NOT)을 하나의 연산으로 간주한다면 괄호 안의 부분 → 논리 부정 → 논리곱 → 논리합의 순서로 계산하며, 논리곱 기호를 생략할 수 있다. 예를 들어 A'B + AB'의 경우 굳이 괄호를 친다면 ((A')B)+(A(B')), 즉 (A' 그리고 B) 또는 (A 그리고 B')가 된다.
논리 부정이 논리곱보다 우선하기 때문에 일반적으로 A(B') = AB' ≠ (AB)' 이다.
드 모르간의 법칙을 이용하면 더 쉽게 계산할 수 있다. 즉 (AB)' = A'+B'이며 (A+B)' = A'B' 이다.
2.4. 행렬
행렬의 경우, 행렬 그 자체가 괄호의 역할을 겸하므로 행렬 내의 연산을 먼저 한다.
행렬의 혼합 계산 역시 수의 혼합 계산의 기본 원칙을 따르며, 이는 행렬과 수가 섞여 있는 혼합 계산에서도 마찬가지이다. 역행렬(-1), 전치(T), 수반연산(*)을 하나의 연산으로 간주한다면 곱셈보다 먼저 계산한다. 예를 들어 행렬 A, B에 대하여 AB-1은 AB의 역행렬이 아니라 A에 B의 역행렬을 곱한 것이다. 즉 A(B-1) = AB-1 ≠ (AB)-1 이다.
2.5. 집합의 연산
집합의 연산에서는 교집합(∩)과 합집합(∪)에 대한 우선 순위를 따로 정하지 않고 괄호로 묶는다. 그래서 분배법칙 등 집합의 연산법칙을 설명할 때 A ∩ (B ∪ C), A ∪ (B ∩ C)라는 표현이 모두 등장한다. 단 교집합, 합집합에 대한 결합법칙은 성립하므로 같은 연산을 여러 번 할 때는 괄호로 묶지 않아도 된다.
여집합(C)을 연산으로 간주한다면 교집합이나 합집합보다 우선한다. 예를 들어 두 집합 A, B에 대하여 A ∪ BC는 A와 B의 합집합의 여집합이 아니라 A와 BC(B의 여집합)의 합집합을 의미한다.
당연히 드 모르간의 법칙이 적용된다. (A ∪ B)C = AC ∩ BC 이며 (A ∩ B)C = AC ∪ BC 이다.
곱집합, 멱집합 같은 것까지 나올 경우 수와 마찬가지로 멱집합 > 곱집합 > 나머지 집합 연산 순으로 진행한다.
3. 컴퓨터에서의 처리
컴퓨터에서도 위와 같은 기본 원칙을 그대로 따른다. 그런데, C 언어 같은 경우에는 덧셈, 곱셈 같은 산술 연산 뿐만 아니라 아래에 나열된 온갖 것을 '연산'으로 취급해서 정해진 우선 순위에 따라 처리하며, 아래에서 괄호부터 대입 연산자까지는 위쪽으로 갈수록 순위가 높다. 또한 같은 형태의 기호라도 어떻게 쓰이는지에 따라, 또는 어떤 위치에 있느냐에 따라 순위가 달라지기도 한다.
논리 연산자 중 &, &&는 논리곱, |, ||는 논리합이고 우선순위는 & > |, && > ||이다. 즉 논리곱과 논리합을 각각 사칙연산의 곱과 합에 대응시켜서 이해할 수도 있다.
- 괄호 ()
- 단항 연산자 ( ++ }}}의 경우
,a++
처럼 후위에 있다면 다른 단항 연산자보다 순위가 높다.a--
- 산술 연산자 ( * / % + - ): *, /, %가 +, -보다 우선한다.
- 비트 쉬프트 연산자 ( >> << )
- 관계 연산자 (< > <= >= )
- 비교 연산자 ( == != )
- 비트 논리 연산자 ( & ^ | ): 우선순위는 & > ^ > |이다.
- 논리 연산자 ( && ||): 우선순위는 && > ||이다.
- 삼항 연산자 ? :
- 대입 연산자 ( = += -= *= /= %= &= ^= |= 등)
- 기타 : 배열 인덱스 [], sizeof, 포인터 ->, 구조체 . 등등, 게다가 C++ 에서는 더 추가되었다.
이런 것들을 모두 '연산'으로 취급해서 그냥 하나의 식으로 만들 수 있다. 예를 들어
과 같이 난해하게 식을 작성해도 문법상으로 문제만 없다면 얼마든지 표현 가능하다.
이런 이유로 복잡한 식을 아주 짧게 표현이 가능해진다는 장점이 있지만, 그만큼 난해한 식이 된다는 단점이 있다. 또한, 이렇게 정의해 버리는 경우 컴파일러 구현에도 장점이 있다 보니, C 언어에 영향받은 다른 언어에서도 자연스럽게 똑같이 따라서 사용하고 있다.
3.1. Microsoft Excel에서
Microsoft Excel에서의 수식 연산 기호에 대해 설명하자면 다음과 같다.
혼합 계산이 있는 수식의 경우, 다음과 같은 규칙을 따른다. 수식을 입력한 후 수식 - 수식 계산 메뉴에서 순서를 직접 확인해 볼 수 있다.
- 기본적인 우선 순위는 거듭제곱(^) > 곱셈, 나눗셈(*, /) > 덧셈, 뺄셈(+, -) > 비교 연산자이다. 비교 연산자를 사용하면 비교 결과에 따라 TRUE(참) 또는 FALSE(거짓)가 된다.
- 단, 가장 왼쪽에 우선 순위가 낮은 연산자가 2개 이상 연속되는 경우 그것을 먼저 계산한다. 예를 들어 =2+2+3*3의 경우 계산 순서는 2+2 → 4+3*3에서 3*3 → 4+9이다.
- 괄호가 있는 경우, 왼쪽에 덧셈, 뺄셈 기호으로 연결된 괄호가 없는 2개 이상의 항이 있으면 왼쪽부터 계산한다. 그렇지 않은 경우는 괄호를 왼쪽부터 계산한다.
- 예를 들어 =1+2+(3+4)의 경우 계산 순서는 괄호를 먼저 계산하는 것이 아니라, 앞의 1+2=3 → 3+(3+4)에서 (3+4)=(7) → 3+(7)=10이다.
- 다른 예를 들어 보면 =1+2*(3+4)의 경우 앞의 1+2를 먼저 계산할 수 없기 때문에 괄호 안의 (3+4)부터 계산한다.
순서는 다음과 같다.=1+(2+3)*4>1+5*6^2
단순한 수식 기호뿐만 아니라 여러 종류의 함수를 한 식에서 사용하거나 수식과 함수를 조합하는 것도 넓은 의미에서 혼합 계산이라고 할 수 있다.
3.2. 수식 트리를 이용한 혼합 계산
[image]
혼합 계산을 위와 같이 이진 트리 구조로 나타낼 수도 있는데, 이것을 수식 트리(Expression Tree, Parse Tree)라고 한다. 수식 트리를 중위 순회 방법으로 순회하여 방문한 각 노드의 내용을 차례대로 쓰고, 하위 노드가 있는 각 노드에 대하여 그 노드와 하위 노드에 해당하는 내용을 괄호로 묶으면 계산식이 된다. 예를 들어 위와 같은 경우, 계산식은 (2+(1*2))*(3+(2*4))가 된다. 즉, 혼합 계산식에서의 괄호가 위의 트리 구조에서 하위 노드가 있는 각 노드에 해당하는 것이다. 단, 여기서 (1*2), (2*4)의 괄호처럼 일부 괄호를 생략해도 수학적으로 올바른 계산식이 도출될 수 있다.
수식 트리의 주요 특징은 다음과 같다.
- 리프 노드(leaf node)가 아닌 노드에는 연산 기호가 들어간다.
- 리프 노드에는 숫자나 문자 등 피연산자가 들어간다.
- 수식의 왼쪽부터 한 문자씩 탐색한다.
- 탐색한 문자가 피연산자이면 그것을 스택에 push한다.
- 탐색한 문자가 연산 기호이면 스택에서 2번 연속 pop하고, 그 값을 각각 a, b라 하자. a와 b를 그 연산 기호로 연산한 값을 push한다. 여기서 pop의 순서는 b → a가 되어야 한다는 점에 주의해야 한다.
- 마지막에는 스택에 하나의 값이 남는데, 그 값이 바로 결과값이다.
여기서 스택에는 마지막에 하나의 값만 남아야 하고, 숫자를 만날 때마다 스택의 항목 수가 1 증가하고, 연산 기호를 만날 때마다 1 감소하므로 수식에서 숫자의 개수는 (연산 기호의 개수+1)이어야 한다는 것을 알 수 있다. 또한 왼쪽부터 문자를 탐색하면서 만난 숫자의 개수가 연산 기호의 개수보다 같거나 많은 적이 없어야 한다.
이 방법을 사용하면 모든 종류의 이항연산자를 동일한 방식으로 취급할 수 있다. 다만, 단항연산자(논리 부정, 여집합 등등)이나 삼항 연산자 등을 처리하기 위해서는 이를 수정해서 사용해야 한다.