brunch

합연산과 곱연산이 헷갈리는 이유

by Han

게임을 서비스하다 보면 합연산, 곱연산 개념이 중요하다.

많은 유저들도 이런 공식에 대해 관심을 가지는데, 의외로 헷갈리는 사람이 많다.

사실 기획자가 좀 더 자세히 알아야 하지만, 아예 수학은 프로그래머에게... 이런 생각으로 던져버리는 경우도 허다하다.


여러 곳에서 이에 대해 설명을 하긴 하지만, 여전히 헷갈리는 이유는 설명하는 사람이 모르는 사람들의 눈높이에 맞지 않게 설명을 하기 때문이다. 그래서 좀 더 길더라도 눈높이에 맞춰서 설명을 해본다.


합연산


일단 다른 곳에서 올라온 설명을 한번 보자.

1.PNG 예시 1
2.PNG 예시 2


예시 1에서 100 + 20 = 120이라고 했는데, 저 20이라는 숫자가 20%가 바로 20이 된 게 아니라, 자신의 기본 활력 100 에다가 20% (20%는 전체의 20% 이므로 100의 20%, 즉 100 * 0.2를 통해 나온 수치다.)를 계산해서 나온 수치이다.

만약 내 활력이 300이라면 20%의 활력을 합연산으로 넣으면, 300 + 20 = 320 이 아니라, 300 + (300 * 0.2) = 360 이 된다.


당연한 게 아닌가 하겠지만 이 부분부터 확실하게 짚어주지 않으면 몰라서 찾아보는 사람들이 결국 헷갈리는 원인이 된다.


예시 2에서도 100(기존)+30*4 = 220이라고 표현했는데, 이걸 정확히 이해 못 한 상태로 보게 되면 만약 기존 대미지가 100 이 아닌 300이라고 가정하면 300 + 30*4 = 420으로 계산해 버리는 참사(?)가 나게 된다.

애초에 30*4 이 부분에서 30이 30%의 30이 아니라, 기본 대미지의 30%를 계산한 결과이다. 단지 기본 대미지가 100으로 가정해서 30이 나왔을 뿐.


결국 300(기존) + 90*4 = 660 이 정확하다. 여기서 90이 기존 대미지 300의 30% 인 90이다. (300 * 0.3)


즉, 예시를 들기 위해 기본 값을 100으로 가정해 놓고 % 수치를 알려주다 보니까 보는 사람 입장에서 %로 환산해서 나온 값과 % 수치가 혼동되는 것이다.


그래서 이해를 돕기 위해 기본 값을 300으로 놓고, 30%짜리 버프 4개를 기준으로 계산을 시작해 보자.


합연산의 표현 방식으로는 2가지가 있다.


1. 300 + 90 * 4 = 660 (기본 값에 증가량을 더하는 표현 방식)


2. 300 * (0.3 + 0.3 + 0.3 + 0.3 + 1) = 660 (기본 값에 증가량을 비율로 계산하는 표현 방식)


1번은 90 * 4를 통해 증가될 실제 수치를 우선 구하고, 내 기본 값에 더해서 결과를 도출하는 것이다.


좀 더 자세히 분해해 보면 300(기본값) + 90(기본값 * 30% ⇒ 300 * 0.3) * 4(버프 4개)


� 기본값이 결국 100% 이므로 이를 곱셈에 사용할 때는 1로 사용해야 한다. 즉 0.3은 30%. 기본값에 30%라는 뜻이다. 너무 단순해 보이지만 이 기본을 이해하지 못하면 계속 헷갈릴 수밖에 없다.


이 부분이 덧셈과 곱셈이 섞여서 헷갈린다면 좀 더 자세히 분해해 보자.

300 + (300 * 0.3) + (300 * 0.3) + (300 * 0.3) + (300 * 0.3) = 660

이렇게 된다.


2번은 증가되어야 할 증가량(30% ⇒ 0.3)을 다 더해서 그만큼 내 기본 값에 곱해주는 방식이다.

이때 뒤에 1을 더하는 것은 기본 값인 300을 100%로 환산하면 소수점으로 변경 시 1이므로 곱하기 전에 기본 값도 포함해 둬야 최종 값이 나온다.

1을 안 더하면 증가 수치 자체만 나온다.


그러면 결과적으로 어떤 방식이 더 가독성이 좋을지를 생각해 보자.


합연산 하면 뭔가를 합한다는 느낌이므로 개인적으로는 2번의 방식이 좀 더 쉽게 와닿는다.

1번도 결과적으로 기본값을 합하지만, 증가량을 곱한다는 방식이 헷갈리게 만드는 것 같다.


이전까지 계산된 대미지 700에 장비로 얻는 냉기 추가 대미지 50%, 버프로 얻는 냉기 추가 대미지 25% 일 경우 합연산 계산이라면


증가할 % 수치는 0.5 + 0.25 = 0.75 (즉 75%)이다.


이걸 이전까지 계산된 대미지에 반영하면 700 * 0.75 = 525가 된다. 이게 실제 증가량이다.


우리는 증가량을 포함한 최종 대미지를 알고 싶으므로 도출된 증가량 525에 이전까지 대미지 700을 더하면 1225라고 계산해도 되지만, 처음부터 증가량만 단독 도출하지 않고, 최종 대미지를 알고 싶다면


700 * (0.5 + 0.25 + 1) = 1225 이렇게 도출하는 것이 쉬워 보인다.


여기서 왜 700을 더하지 않고 곱하냐면 이미 이전까지의 대미지인 700은 (0.5 + 0.25 + 1) 여기서 1로 들어갔다. 그런데 이 1이 얼마인지를 알지 못하므로 1은 700이다.라는 의미로 전체 값에 수치를 반영하기 위해 700을 곱하는 거다.


100명의 사람이 있는데, 10%가 늘어나면 10%를 소수로 환산 0.1로 변환되고 (전체를 소수로 1로 환산하니까), 100명 중의 0.1이니까 100 * 0.1은 늘어난 사람 수를 나타낸다.

최종 결과 사람 수는 100 * 0.1에서 0.1에 전체 기본값인 1을 더해서 100 * 1.1 = 110명이 된다. 쉬운 부분이지만 이 개념을 헷갈리지 말도록 하자.


결국 이 공식이 헷갈리는 이유는 어디에서는 기본 값을 더해주고, 어디에서는 곱해주고 이러니까 공식이 헷갈리는 것인데, 위의 2번 공식처럼 소수 계산을 통해 기본 값을 얼마큼의 비율로 증가시키냐를 계산할 때는 비율의 100% 값을 알아야 하므로 기본 값을 곱해주는 것이고, 1번 공식처럼 비율로 계산하는 것이 아니라 이미 증가량을 계산해놓고, 기본값과 더하는 방식으로 표현할 때는 더해주는 것이다.


결론은 합연산 계산의 경우 적용될 %를 소수점으로 바꿔서 모두 합하고, 기본값인 환산한 소수값 1을 합해서 기본값 자체를 곱해주면 결과 값이 나온다.


곱연산


곱연산은 사실 별거 없다.

합연산 때의 조건을 그대로 재활용해 보자.


이전까지 계산된 대미지 700에 장비로 얻는 냉기 추가 대미지 50%, 버프로 얻는 냉기 추가 대미지 25%가 곱연산으로 계산된다면

700 * 1.5 * 1.25 = 1312.5가 된다.


합연산에서 설명했듯이 50% 증가에서 0.5를 곱하지 않는 이유는 증가량이 아닌 최종 값을 구하기 위해서 기본 값인 700을 소수점으로

환산해서 1로 바꿨으므로 그 1을 0.5에 이미 더해준 값이다. 그리고 그 1이 700이라는 뜻으로 700을 곱하는 것이다.


좀 더 자세히 보면

이전까지 주어진 대미지 : 700

700을 소수로 환산해서 전체를 1로 환산 + 50%를 소수로 환산 0.5 : 1.5

700을 소수로 환산해서 전체를 1로 환산 + 25%를 소수로 환산 0.25 : 1.25

결과 : 700 * 1.5 * 1.25 = 1312.5가 된다.


비교


이제 합연산과 곱연산을 비교해 보자.

비슷한 방식으로 비교를 해야 헷갈리지 않는다. (다른 곳에서 설명하는 것을 보니 합연산은 이미 환산된 수치로 계산하고, 곱연산은 소수점으로 계산하고, 섞어서 설명을 하더라)


합연산 : 700 * (0.5 + 0.25 + 1) = 1225

곱연산 : 700 * (0.5 + 1) * (0.25 + 1) = 1312.5


자. 결국 기본으로 주어진 값인 700은 고정을 곱해줄 건데, 합연산은 증가할 수치들이 먼저 합해져서 기본값에 곱하고, 곱연산은 증가할 수치들을 개별로 보고, 그냥 곱해준다.


곱연산의 개별 수치들은 모두 각각 따로 처리하므로 각각 기본 값인 1을 더하는 건 이제 이해하리라 생각한다.


합연산은 증가할 수치를 먼저 합하고 계산하고, 곱연산은 순서대로 곱한다.



특징


합연산은 계산에 사용하는 기본 값을 변경하지 않고, 증가나 감소할 수치를 합산 후에 계산하므로 값이 일정하게 증가, 감소하지만, 곱연산은 계산에 사용하는 기본 값을 이전에 끝난 계산 값으로 사용하므로 증가 시에는 기본 값이 늘어나 더 많은 양이 늘어나고, 감소 시에는 기본 값이 줄어들어 더 적은 양이 줄어든다.


3.PNG


차트를 보자. 증가하는 부분에서는 곱연산은 이전까지의 값을 기준으로 계산되므로 점차 불어난다.

감소하는 부분에서는 오히려 낮아진 값을 기준으로 계산하므로 점차 완만해진다. (그래서 결국 곱연산으로 감소하면 0이 되지 않고 한없이 0에 가까워지기만 한다.)


결국 증가하는 수치는 곱연산이 유리하고, 감소하는 수치는 합연산이 유리하다.


keyword