[JavaScript] mod 연산

김진용·2023년 3월 8일

자바스크립트

목록 보기
4/6

🙄 자바스크립트의 mod 연산

프로그래머스의 "3 x n 타일링" 문제를 푸는 과정에서 mod 연산을 이용해야 했다

파이썬에서 이용했을 때와 같이 단순하게 작성했는데 음수값이 나왔다!

자바스크립트에서의 mod 연산은 약간 다르다는 것을 알게 되어 공부해보기로 했다

🤔 mod 연산이란?

mod 연산이란 나머지 연산을 의미하는데 모듈러 연산이라고도 한다

나머지 연산이라는 이름 그대로 어떤 한 수를 다른 수로 나누었을 때의 나머지를 구하는 연산을 의미한다

그리고 nm으로 나누었을 때의 나머지 r 의 범위는 주로 0 ~ m - 1의 값을 가진다

자바스크립트에서의 mod 연산은 % 를 이용하며, a % b(a를 b로 나눈 나머지) 처럼 사용한다

전공 수업으로 암호학 수업을 들었을 때 RSA 암호화 방식에서 사용한다고 배우기도 했다

모듈러 연산의 성질, 개념 등을 깊게 이해하려면 수학적으로 접근해야 하기 때문에 알고리즘에서 어떻게 활용되는지를 중점적으로 접근해보려 한다

😎 mod 연산의 성질

mod 연산은 주로 크기가 고정된 배열에서 인덱스를 특정 단위로 이동할 때 사용한다

const arr = [1, 2, 3, 4, 5];
let idx = 0;

for (let count = 0; count < 5; count++) {
  console.log(arr[idx]);
  idx = (idx + 2) % 5;
};
// output : 1, 3, 5, 2, 4

위 코드는 배열의 요소를 2씩 늘려가며 선택하는데 mod 연산을 사용한 예시다

그리고 덧셈, 뺄셈, 곱셈 에서도 mod 연산을 사용할 수도 있는데 각각 아래와 같은 공식이 있다

(A+B) mod C=(A mod C+B mod C) mod C(A + B)\ mod\ C = (A\ mod\ C + B\ mod\ C)\ mod\ C
(AB) mod C=(A mod CB mod C) mod C(A - B)\ mod\ C = (A\ mod\ C - B\ mod\ C)\ mod\ C
(AB) mod C=(A mod CB mod C) mod C(A * B)\ mod\ C = (A\ mod\ C * B\ mod\ C)\ mod\ C

물론 나눗셈에 대한 공식도 있는데, 페르마의 소정리라는 것을 사용한다....

😒 자바스크립트의 mod 연산

이렇게 공부하게 된 가장 큰 원인은 뺄셈에서의 mod 연산때문이었다

-3 % 5 = 2 이다 왜냐하면 -3 = 5 * (-1) + 2 로 표현할 수 있기 때문이다

⭐ 하지만 자바스크립트에서 -3 % 5 = -3 이 된다! ⭐

왜냐하면 모듈러 연산을 한 뒤에 왼쪽 피연산자의 부호를 따른다!!

const arr = [1, 2, 3, 4, 5];
let idx = 0;

for (let count = 0; count < 5; count++) {
  console.log(arr[idx]);
  idx = (idx - 2) % 5;
};
// 오류가 발생

이렇게 왼쪽으로 2씩 이동하면서 요소를 선택하려고 한다면, 음수 인덱스로 접근하는 식이 되버려서 오류가 발생하게 된다

따라서 n % m, n < 0 을 해야하고, mod 연산의 결과가 양수가 나오도록 코드를 구성해야 한다면

((n % m) + m) % m 과 같은 방식으로 해서 결과를 양수로 이끌어내줘야 한다 ⭐

const MOD = 1000000007;
const modResult = (((dp[i - 1] * 4) % MOD) - (dp[i - 2] % MOD) + MOD) % MOD;

위 코드처럼 뺄셈의 모듈러 연산 공식을 사용한 뒤에 MOD를 추가적으로 더해줘서 양수 값을 저장하게 할 수 있다

😁 결론

알고리즘 문제를 풀다보면 가끔 mod 연산을 사용해야 할 때가 있다

이번 기회에 JS에서 mod 연산이 어떻게 동작하는지 알 수 있었다

자바스크립트에서 mod 연산을 사용해서 배열을 순회한다면 꼭 양수로 바꿔주는 작업을 수행하자!

profile
개발자가 되기 위해 꿈틀대고 있습니다.

1개의 댓글

comment-user-thumbnail
2023년 7월 3일

글 잘 봤습니다!! 술술 잘 읽혀요 검색해도 이해가 잘 안됐는데 좋은 글 작성해주셔서 감사합니다

답글 달기