모듈로 연산을 사용하여 일관된 인덱싱 처리
🔹 비교배열이 기준배열보다 긴 경우
✅ 모듈로 연산(i % pattern.length)은 항상 0 이상 pattern.length - 1 이하의 값을 반환
✅ 즉, 패턴이 길어도 i가 그 범위를 초과하지 않으면 처음 몇 개 값만 사용됨
const answers = [1, 3, 2]; // 정답 3문제
const pattern = [1, 2, 3, 4, 5, 6, 7, 8]; // 8개짜리 패턴 (더 김)
for (let i = 0; i < answers.length; i++) {
console.log(`answers[${i}] = ${answers[i]}, pattern[${i % pattern.length}] = ${pattern[i % pattern.length]}`);
}
// answers[0] = 1, pattern[0] = 1
// answers[1] = 3, pattern[1] = 2
// answers[2] = 2, pattern[2] = 3
→ 패턴이 길더라도 처음 answers.length만큼만 비교되므로, i % pattern.length는 그냥 i와 동일한 효과.
💡 즉, pattern.length >= answers.length일 때 i % pattern.length는 그냥 i와 동일하게 동작하지만, 통일된 방식으로 코드가 유지되기 때문에 추가적인 조건문을 넣지 않아도 됨
🔹 비교배열이 기준배열보다 짧은 경우
✅ 이 경우는 반복을 해야 하므로 모듈로 연산이 반드시 필요함.
const answers = [1, 3, 2, 4, 2, 5]; // 정답 6문제
const pattern = [1, 2, 3]; // 패턴 3개 (짧음)
for (let i = 0; i < answers.length; i++) {
console.log(`answers[${i}] = ${answers[i]}, pattern[${i % pattern.length}] = ${pattern[i % pattern.length]}`);
}
// answers[0] = 1, pattern[0] = 1
// answers[1] = 3, pattern[1] = 2
// answers[2] = 2, pattern[2] = 3
// answers[3] = 4, pattern[0] = 1 // 반복 시작
// answers[4] = 2, pattern[1] = 2
// answers[5] = 5, pattern[2] = 3
→ 패턴이 반복되면서 비교됨.
🔹 결론
✔ 패턴이 answers보다 길거나 같으면 i % pattern.length가 그냥 i처럼 동작
✔ 패턴이 짧으면 i % pattern.length를 이용해 주기적으로 반복되도록 만듦
✔ 이 방식을 쓰면 패턴 길이에 상관없이 하나의 코드로 통일 가능
✔ 즉, 코드의 일관성을 위해 항상 i % pattern.length를 사용하는 것이 좋은 습관 🚀
✅ 비슷한 개념을 활용하는 곳
• 라운드 로빈 스케줄링 (Round Robin Scheduling) → CPU 스케줄링에서 일정한 순서로 반복 실행
• 해시 테이블 (Hash Table) 충돌 해결 → index % tableSize를 활용한 해싱 기법
• 원형 큐 (Circular Queue) → 고정된 크기에서 순환적으로 데이터를 처리할 때 i % size 사용
• 애니메이션 프레임 루핑 → 프레임 인덱스를 모듈로 연산을 이용해 반복
'algorithm' 카테고리의 다른 글
행렬의 곱셉 (1) | 2025.02.22 |
---|---|
핵심키워드에 따른 알고리즘 선택 방법 (1) | 2025.02.21 |
[240618 TIL] Sliding Window (0) | 2024.06.18 |
[240612 TIL] 완전탐색, 비트연산자 (0) | 2024.06.12 |
[240529 TIL] 기사단원의 무기(코딩테스트) (0) | 2024.05.29 |