프로그래머스의 "3 x n 타일링" 문제를 푸는 과정에서 mod 연산을 이용해야 했다
파이썬에서 이용했을 때와 같이 단순하게 작성했는데 음수값이 나왔다!
자바스크립트에서의 mod 연산은 약간 다르다는 것을 알게 되어 공부해보기로 했다
mod 연산이란 나머지 연산을 의미하는데 모듈러 연산이라고도 한다
나머지 연산이라는 이름 그대로 어떤 한 수를 다른 수로 나누었을 때의 나머지를 구하는 연산을 의미한다
그리고 n을 m으로 나누었을 때의 나머지 r 의 범위는 주로 0 ~ m - 1의 값을 가진다
자바스크립트에서의 mod 연산은 % 를 이용하며, a % b(a를 b로 나눈 나머지) 처럼 사용한다
전공 수업으로 암호학 수업을 들었을 때 RSA 암호화 방식에서 사용한다고 배우기도 했다
모듈러 연산의 성질, 개념 등을 깊게 이해하려면 수학적으로 접근해야 하기 때문에 알고리즘에서 어떻게 활용되는지를 중점적으로 접근해보려 한다
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 연산을 사용할 수도 있는데 각각 아래와 같은 공식이 있다
물론 나눗셈에 대한 공식도 있는데, 페르마의 소정리라는 것을 사용한다....
이렇게 공부하게 된 가장 큰 원인은 뺄셈에서의 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 연산을 사용해서 배열을 순회한다면 꼭 양수로 바꿔주는 작업을 수행하자!
글 잘 봤습니다!! 술술 잘 읽혀요 검색해도 이해가 잘 안됐는데 좋은 글 작성해주셔서 감사합니다