개요
개발을 하다 보면 일정한 패턴이 반복되는 데이터를 처리해야 하는 경우가 자주 발생합니다. 이때 나머지 연산(%)을 활용하면 배열의 인덱스를 순환하여 데이터를 반복적으로 참조할 수 있습니다.
본 글에서는 나머지 연산을 이용한 배열 순환처리에 대해서 공부한 지식을 정리한 글입니다.
배열 순환을 위한 나머지 연산 활용
배열의 길이를 초과하는 인덱스를 처리할 때, 나머지 연산을 이용하면 배열의 범위를 벗어나지 않고 다시 처음부터 순차적으로 접근할 수 있습니다. 예를 들어, 배열의 길이가 5일 때 i % 5를 하면 i가 아무리 커져도 항상 0에서 4 사이의 값이 나옵니다.
예시 문제
프로그래머스의 "모의고사" 문제는 배열 순환을 위한 나머지 연산을 활용하기에 적합한 문제입니다.
위 문제는 수포자들이 특정 패턴으로 답을 찍는 상황입니다. 각 수포자의 제출한 답이 일정한 패턴으로 반복되며, 각 수포자가 맞춘 답의 개수를 계산해야하는 문제입니다.
for(int i = 0; i < answers.length ; i++){
if(answers[i] == supo1[i]){
score[0]++;
}
if(answers[i] == supo2[i]){
score[1]++;
}
if(answers[i] == supo3[i]){
score[2]++;
}
}
이런식으로 각 수포자들이 맞춘 정답을 계산한다면 다른 테스트케이스에서 실패하게 됩니다. 이유는 문제를 찍는 패턴을 반복적으로 처리하고 있지 않아서 입니다.
위 코드는 각 패턴의 길이를 고려하지 않고 그대로 비교하고 있기 때문에 각 수포자가 찍는 답안의 반복 패턴을 고려해야하며, 이 때 나머지 연산을 사용해야합니다.
for(int i = 0; i < answers.length ; i++){
if(answers[i] == supo1[i % supo1.length]){
score[0]++;
}
if(answers[i] == supo2[i % supo2.length]){
score[1]++;
}
if(answers[i] == supo3[i % supo3.length]){
score[2]++;
}
}
i % supo1.length는 i 값이 배열 supo1의 길이를 초과하더라도 0에서 supo1.length - 1 범위의 값을 계속 반복적으로 반환합니다. 이로 인해 배열의 패턴을 순환하여 사용할 수 있게 됩니다.
- 첫 번째 문제: i = 0, supo1[0 % 5] = 1
- 두 번째 문제: i = 1, supo1[1 % 5] = 2
- 여섯 번째 문제: i = 5, supo1[5 % 5] = 1 ← 배열의 처음으로 돌아감
따라서 인덱스가 배열의 길이보다 작을 때에는 i와 동일하고 인덱스가 배열의 길이를 초과할 때는 나머지 연산을 통해 인덱스가 다시 배열의 처음으로 돌아와서 패턴이 반복됩니다.
저도 헷갈렸기 때문에 좀 더 쉽게 요약을 하자면 다음과 같습니다.
예를 들어 수포자 1의 패턴이 {1, 2, 3, 4, 5}로 반복되는데, 문제의 개수가 패턴의 길이(5)보다 길다면 나머지 연산(%)을 사용해서 패턴을 반복하는 방식으로 처리할 수 있습니다.
- 수포자 1의 패턴은 {1, 2, 3, 4, 5}이고, 문제 정답 배열이 6개일 때, 문제 6번에서 인덱스 i = 5가 됩니다.
- 하지만, supo1[5]는
존재하지 않기 때문에 인덱스 에러가 발생할 수 있습니다. - 이때, 나머지 연산을 사용해서 i % supo1.length를 계산하면:
- 5 % 5 = 0
- 따라서, 6번째 문제에서 수포자 1의 답은 supo1[0] = 1이 되어, 첫 번째 답으로 돌아가서 반복하게 됩니다.
이처럼 나머지 연산을 사용한 배열 순환은 일정한 패턴이 반복되는 문제를 해결할 때 매우 유용한 방법입니다. 이를 통해 배열이나 데이터를 끝없이 순환하며 처리할 수 있습니다.
'TIL,일일 회고' 카테고리의 다른 글
[TIL, 일일 회고] 2024.09.26 - 제곱근을 이용한 효율적인 약수 계산 방법 (0) | 2024.09.26 |
---|---|
[TIL, 일일 회고] 2024.09.25 - Arrays.fill() 메서드 (프로그래머스 - 덧칠하기) (1) | 2024.09.25 |
[TIL, 일일 회고] 2024.09.23 - Feign Client에서 PATCH 메서드 사용 시 발생하는 문제와 해결 방법 (0) | 2024.09.23 |
[TIL, 일일 회고] 2024.09.22 - 대용량 데이터 에러 해결 트러블 슈팅 (0) | 2024.09.22 |
[TIL, 일일 회고] 2024.09.21 - N+1 문제 해결 및 성능 최적화: HubPath 조회 트러블슈팅 (0) | 2024.09.22 |